notepad ++ comprimento regex em bytes

1

Eu estou lutando para criar um regexp no notepad ++ que encontre e substitua um número x de bytes com nada. Contagem de retorno de carro (0D), contagens de avanç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})

Esse regex não encontra nada, ele diz que nenhuma correspondência foi encontrada. Eu posso encontrar \x0C , e eu posso encontrar . , mas não consigo encontrar .{318} também . pula sobre 0x0A e 0x0D

O

-wrap está marcado.

A expressão

-regular é verificada.

Aqui faz 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..]
    
por UpTide 26.05.2017 / 18:07

1 resposta

0

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

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

Se todas as opções acima forem verdadeiras, você pode usar o seguinte regex:

\x0C[^\xFF]{318}

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

Tenha em mente que este método conta o windows / mac Newlines como dois caracteres / bytes (por sua solicitação).

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

EDIT - Regex explicado

Expressão completa

\x0C[^\xFF]{318}

Vamos analisar isso.

\ x0C

Isto corresponde a um único grafo de Unicode, você pode encontrar mais informações sobre este aqui . Em resumo, você pode considerar \ xa versão Unicode do ponto, exceto que também pode corresponder a quebras de linha (isso é importante, mais sobre isso mais tarde).

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

[^ \ xFF]

Tudo entre [] é chamado de Conjunto de caracteres (não deve ser confundido com o mesmo conceito em Codificação de caracteres ). Você pode ler mais sobre isso no Tutorial Regexp, mas em resumo, ele serve como uma instrução "OR". [ab] significa simplesmente "a ou b". Quando ^ é usado dentro de um conjunto de caracteres, serve como uma negação. Então [^ a] significa "não é um". Em nosso caso de uso, procuramos por 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 na frente dele, então, neste caso, o conjunto de caracteres [^ \ xFF].

Por que \ xFF?

Na notação hexadecimal, o conjunto de caracteres us-ascii vai de 00 até 7E . Qualquer valor maior não pode ser mapeado para um ponto de código us-ascii. Isso significa que qualquer arquivo codificado (corretamente) em us-ascii, pode conter apenas valores HEX entre 00 e 7E. Como resultado, não pode conter FF.

Assim, podemos usar esse recurso para procurar qualquer caractere, incluindo caracteres de nova linha, desde \ x .. também corresponde a novas linhas como \ x0A e \ x0C. Quando procuramos por qualquer caracter que não seja não FF, acabamos por encontrar todos caracteres

.

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

    
por 08.06.2017 / 09:33