462 votes

Quels caractères spéciaux doivent être échappés dans les expressions régulières?

Je suis fatigué de toujours essayer de deviner, si je devrais échapper les caractères spéciaux comme " `` " etc. lors de l’utilisation de nombreuses implémentations d’expressions régulières.

C’est différent avec, par exemple, Python, sed, grep, awk, Perl, renommer, Apache, trouver et ainsi de suite. Existe-t-il un ensemble de règles qui raconte quand je devrais, et quand je ne devrais pas, échapper les caractères spéciaux ? Cela dépend-il du type de regexp, comme PCRE, POSIX ou expressions régulières étendues ?

425voto

Jan Goyvaerts Points 10402

Quels sont les personnages que vous devez et que vous ne pouvez pas échapper, en effet, dépend de la regex saveur que vous travaillez avec.

Pour PCRE, et la plupart des autres soi-disant Perl-compatible saveurs, d'échapper à ces classes de personnage:

.^$*+?()[{\|

et à l'intérieur de ces classes de personnage:

^-]\

Pour POSIX étendue regexes (ERE), d'échapper à ces classes de personnages (le même que PCRE):

.^$*+?()[{\|

Échapper à tout les autres personnages s'agit d'une erreur POSIX ERE.

À l'intérieur des classes de caractères, l'antislash est un caractère littéral dans les expressions régulières POSIX. Vous ne pouvez pas l'utiliser pour échapper à quoi que ce soit. Vous devez utiliser le "placement intelligent" si vous voulez inclure le caractère de classe des caractères comme des littéraux. Mettre le ^ n'importe où sauf au début, l' ] au début, et le - au début ou à la fin de la classe de personnage pour correspondre à ces littéralement, par exemple:

[]^-]

Dans POSIX de base des expressions régulières (REP), ce sont des caractères de remplacement que vous avez besoin pour échapper à supprimer leur sens:

.^$*

S'échapper des parenthèses et accolades dans les BREs leur donne un sens particulier à leur sans échappement versions ont en EREs. Certaines implémentations (par exemple, GNU) également à donner du sens à d'autres personnages quand échappé, comme \? et +. Échapper un caractère autre qu' .^$*(){} est normalement une erreur de BREs.

À l'intérieur des classes de caractères, de BREs de suivre la même règle que EREs.

Si tout cela vous fait tourner la tête, prenez une copie de RegexBuddy. Sous l'onglet Créer, cliquez sur Insérer un Jeton, puis Littérale. RegexBuddy va ajouter échappe en tant que de besoin.

23voto

Dillie-O Points 16780

Malheureusement il n’est pas vraiment un ensemble fixe de codes d’échappement puisqu’elle varie selon le langage que vous utilisez.

Toutefois, garder une page comme la Page des outils Expression régulière ou cette Triche d’Expression régulière peut aller un long chemin pour vous aider à filtrer rapidement les choses.

7voto

Jonathan Leffler Points 299946

POSIX reconnaît de multiples variations sur les expressions régulières de base des expressions régulières (REP) et les expressions régulières étendues (ERE). Et même alors, il y a des bizarreries en raison de l'historique des implémentations des services publics standardisé par la norme POSIX.

Il n'y a pas de règle simple pour quand utiliser la notation, ou même que la notation d'une commande utilise.

Découvrez Jeff Friedl du Mastering Regular Expressions livre.

5voto

Darron Points 13196

Malheureusement, le sens des choses comme ( et \( sont échangés entre Emacs style expressions régulières, et la plupart des autres styles. Donc, si vous essayez d'échapper à ces vous pouvez peut-être faire le contraire de ce que vous voulez.

Donc, vous avez vraiment besoin de savoir ce que le style que vous essayez de devis.

4voto

Charlie Martin Points 62306

Vraiment, il n'y en a pas. il y a environ un demi-million de différentes regex syntaxes; ils semblent venir vers le bas pour Perl, EMACS/GNU, et AT&T en général, mais je suis toujours surpris aussi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X