
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 \x0C
e 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.