1 votes

Notepad++ regex longueur en octets

Je lutte pour trouver une expression régulière dans notepad++ qui trouve et remplace x octets par rien. Retour chariot (0D) compte, saut de ligne compte (0A).

Voici la regex que j'essaie : (0C est mon début, je supprime 318 octets après 0C ainsi que le 0C)

\x0C(.{318})

Cette regex ne trouve rien, elle dit qu'aucune correspondance n'a été trouvée. Je peux trouver \x0C, et je peux trouver . mais je ne peux pas trouver .{318} aussi . saute par-dessus 0x0A et 0x0D

-l'enveloppement est coché.

-l'expression régulière est coché.

Voici une partie du fichier en hexadécimal avec 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..]
0  1  2  '  4  5  60  a  2 3  4[snip] 25 [etc..]

0voto

Wouter Points 1441

Comme vous l'avez mentionné, l'encodage est us-ascii, nous pouvons donc supposer que chaque caractère est un octet. En regex, le '.' correspond à n'importe quel caractère, sauf les sauts de ligne, et vous voulez que chaque partie individuelle d'un saut de ligne CR/LF soit correspondue séparément, car ils sont sur deux octets.

Je vais également supposer que vous traitez des données textuelles réelles, et non un fichier binaire pouvant contenir des octets en dehors de la correspondance de caractères us-ascii.

Si tout ce qui précède est vrai, vous pouvez utiliser le regex suivant :

\x0C[^\xFF]{318}

La raison pour laquelle le '.' n'a pas fonctionné dans votre tentative, c'est parce que le '.' ne correspond pas aux sauts de ligne. Vous ne pouvez pas non plus utiliser \x0C[.\r\n]{318}, car le joker '.' n'est pas disponible dans une classe de caractères (groupe entre crochets). La valeur hexadécimale FF ne correspond à aucun point de code valide dans l'ensemble de caractères us-ascii, et donc lorsque vous recherchez "n'importe quel caractère qui n'est pas le caractère FF", vous prendrez en compte des octets.

Gardez à l'esprit que cette méthode compte les sauts de ligne Windows/Mac comme deux caractères/octets (selon votre demande).

J'espère que c'est ce que vous cherchiez...

MODIFICATION - Explication du regex

Expression complète

\x0C[^\xFF]{318}

Expliquons cela.

\x0C

Cela correspond à un Graphème Unicode unique, vous pouvez trouver plus d'informations à ce sujet ici. En résumé, vous pouvez considérer que \x est la version Unicode du point, sauf que cela peut également correspondre à des sauts de ligne (ceci est important, plus d'informations à ce sujet plus tard).

Mais, étant donné que vous l'avez également utilisé, je suppose que vous êtes déjà en partie familier avec cela.

[^\xFF]

Tout ce qui se trouve entre [] s'appelle un Ensemble de caractères (à ne pas confondre avec le même concept dans l'encodage de caractères). Vous pouvez en lire plus sur le Tutoriel Regexp, mais en résumé, cela sert de déclaration "OU". [ab] signifie simplement "a ou b". Lorsque ^ est utilisé à l'intérieur d'un ensemble de caractères, il sert de négation. Ainsi [^a] signifie "pas a". Dans notre cas d'utilisation, nous recherchons tout caractère qui n'est pas la valeur HEX FF.

{318}

Et nous recherchons ce genre de caractère, 318 fois. La syntaxe {} s'applique toujours à l'élément Regex juste devant, donc dans ce cas l'ensemble de caractères [^\xFF].

Pourquoi \xFF ?

En notation hexadécimale, l'ensemble de caractères us-ascii va de 00 à 7E. Toute valeur supérieure ne peut pas être mappée à un point de code us-ascii. Cela signifie qu'un fichier encodé (correctement) en us-ascii ne peut contenir que des valeurs HEX entre 00 et 7E. Par conséquent, il ne peut pas contenir FF.

Ainsi, nous pouvons utiliser astucieusement cela pour rechercher tout caractère y compris les caractères de saut de ligne, car \x.. correspond également à des sauts de ligne comme \x0A et \x0C. Lorsque nous recherchons tout caractère qui n'est pas FF, nous trouvons chaque caractère.

Gardez à l'esprit que cette solution dépend du fait que votre fichier est encodé en us-ascii, et non en UTF-8.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X