EDITAR - Regex explicado

EDITAR - Regex explicado

Estou lutando para criar um regexp no notepad ++ que encontre e substitua x número de bytes por nada. Contagens de retorno de carro (0D), contagens de alimentação de linha (0A).

Este é o regex que estou tentando: (0C é meu começo, estou removendo 318 bytes após 0C junto com 0C)

\x0C(.{318})

Este regex não encontra nada, diz que nenhuma correspondência foi encontrada. Posso encontrar \x0Ce posso encontrar, .mas não consigo encontrar, .{318}também .pula 0x0A e 0x0D

-wrap around está marcado.

-expressão regular é verificada.

Aqui está parte do arquivo em hexadecimal com ascii:

0C 30 31 32 27 34 35 36 0D 0A 30 61 32 0D 33 34 0A [snip] 0C 32 0A 0D 35 [etc..]
<ff>0  1  2  '  4  5  6<cr><lf>0  a  2<cr> 3  4<lf>[snip]<ff> 2<lf><cr>5 [etc..]

Responder1

Como você mencionou que a codificação é us-ascii, podemos assumir que cada caractere tem um byte. Em regex, o '.' corresponde a qualquer caractere, exceto novas linhas, e você deseja que cada parte individual de uma nova linha CR/LF seja correspondida separadamente, pois são dois bytes.

Também presumirei que você está processando dados de texto reais, e não um arquivo binário que pode conter bytes fora do mapeamento de caracteres us-ascii.

Se tudo o que foi dito acima for verdade, você pode usar o seguinte regex:

\x0C[^\xFF]{318}

A razão pela qual o '.' não funcionou na sua tentativa, é porque o '.' não corresponde às novas linhas. Você também não pode usar \x0C[.\r\n]{318}, porque o '.' curinga não está disponível em uma classe de caracteres (grupo de colchetes). O valor hexadecimal FF não é mapeado para nenhum ponto de código válido dentro do conjunto de caracteres us-ascii e, portanto, quando você procurar por "qualquer caractere que não seja o caractere FF", você estará tomandobytesem consideração.

Tenha em mente que este método conta as novas linhas do Windows/Mac como dois caracteres/bytes (conforme sua solicitação).

Espero que isto seja o que você estava procurando...

EDITAR - Regex explicado

Expressão completa

\x0C[^\xFF]{318}

Vamos analisar isso.

\x0C

Isso corresponde a um grafema Unicode único. Você pode encontrar mais informações sobre issopor aqui. Em resumo, você pode considerar \x a versão Unicode do ponto, exceto quetambém pode corresponder a quebras de linha(isso é importante, falaremos mais sobre isso depois).

Mas, como você também usou isso, suponho que já esteja parcialmente familiarizado com isso.

[^\xFF]

Tudo entre [] é chamado deConjunto de caracteres(não deve ser confundido com o mesmo conceito na codificação de caracteres). Você pode ler mais sobre isso no Tutorial Regexp, mas em resumo, serve como uma instrução "OR". [ab] significa simplesmente "a ou b". Quando ^ é usado dentro de um conjunto de caracteres, ele serve como uma negação. Então [^a] significa "não um". Em nosso caso de uso, procuramos qualquer caractere que não seja o valor HEX FF.

{318}

E procuramos esse tipo de personagem 318 vezes. A sintaxe {} sempre se aplica ao elemento Regex logo na frente dele, portanto, neste caso, o conjunto de caracteres [^\xFF].

Por que \xFF?

Na notação hexadecimal, o conjunto de caracteres us-ascii vaidas 00h às 7E. Qualquer valor superior não pode ser mapeado para um codepoint us-ascii. Isso significa que qualquer arquivo codificado (corretamente) em us-ascii só pode conter valores HEX entre 00 e 7E. Como resultado, não pode conter FF.

Portanto, podemos usar isso de maneira inteligente para procurar qualquer caractere, incluindo caracteres de nova linha, já que \x.. também corresponde a novas linhas como \x0A e \x0C. Quando procuramos por qualquer personagem que sejanãoFF, acabamos encontrandotodopersonagem.

Lembre-se de que esta solução depende do fato de seu arquivo estar codificado em us-ascii e não em UTF-8.

informação relacionada