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

j'en ai assez de toujours essayer de deviner, si je devais échapper à des personnages spéciaux comme ()[]{}| " etc. lors de l'utilisation de nombreuses implémentations de regexps.

Il est différent avec, par exemple, Python, sed, grep, awk, Perl, renommer, Apache, trouver et ainsi de suite. Y a-t-il un ensemble de règles qui indique quand je devrais, et quand je ne devrais pas, échapper aux caractères spéciaux? Dépend-il du type regexp, comme PCRE, POSIX ou regexps étendu?

321
demandé sur Mechanical snail 2008-12-30 02:32:04

8 réponses

quels personnages devez-vous et que vous ne devez pas échapper dépend en effet de la saveur regex que vous travaillez avec.

pour PCRE, et la plupart des autres saveurs soi-disant compatibles Perl, échapper à ces classes de caractères extérieurs:

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

et ces classes de caractères intérieures:

^-]\

pour POSIX extended regexes (ERE), échapper à ces classes de caractères extérieurs (même que PCRE):

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

échapper à tout autre caractère est une erreur avec POSIXERE.

dans les classes de caractères, le 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 "placement intelligent" si vous voulez inclure la classe de caractère metacharacters comme littéraux. Mettez le ^ n'importe où sauf au début, le ] au début, et le - au début ou à la fin de la classe de caractères pour correspondre à ceux-ci littéralement, par exemple:

[]^-]

dans POSIX basic regular expressions (BRE), ce sont des métacharactères que vous devez échapper pour supprimer leur sens:

.^$*

échappe entre parenthèses et crochets bouclés dans BREs leur donne le sens particulier que leurs versions non escapadrées ont dans EREs. Certaines implémentations (par exemple GNU) donnent aussi un sens particulier à d'autres caractères lorsqu'ils sont échappés, comme \? et.+ Échapper à un personnage autre que .^ $ * () {} est normalement une erreur avec BREs.

dans les classes de caractères, BREs suit la même règle que EREs.

si tout cela fait tourner votre tête, prenez une copie de RegexBuddy . Sur L'onglet Créer, cliquez Insérer Token, puis littéral. RegexBuddy ajoutera des évasions au besoin.

305
répondu Jan Goyvaerts 2013-07-18 01:13:26

Moderne RegEx Saveurs (PCRE)

Includes C, C++, Delphi, EditPad, Java, JavaScript, Perl, PHP (preg), PostgreSQL, PowerGREP, PowerShell, Python, REALbasic, Real Studio, Ruby, TCL, VB.Net, VBScript, wxWidgets, XML Schema, Xojo, XRegExp.

la compatibilité PCRE peut varier

n'importe où: . ^ $ * + - ? ( ) [ ] { } \ |


Saveurs Legacy RegEx (BRE/ERE)

Includes awk, ed, egrep, emacs, GNUlib, grep, PHP (ereg), MySQL, Oracle, r, sed.

PCRE soutien peut être activé dans les versions ultérieures, ou en utilisant des extensions

ERE / awk/egrep / emacs

en dehors d'une classe de caractères: . ^ $ * + ? ( ) [ { } \ |

    À l'intérieur d'une classe de caractères: ^ - [ ]

BRE / ed / grep/sed

en dehors d'une classe de caractères: . ^ $ * [ \

    À l'intérieur d'une classe de caractères: ^ - [ ]

    Pour les littéraux, n'échappent pas à: + ? ( ) { } |

    Pour un comportement regex standard, escape: \+ \? \( \) \{ \} \|


Notes

  • si vous n'êtes pas sûr d'un caractère spécifique, il peut être échappé comme \xFF
  • les caractères alphanumériques ne peuvent pas être échappés avec un antislash
  • les symboles arbitraires peuvent être échappés avec un antislash en PCRE, mais pas en BRE / ERE (ils ne doivent être échappés que si nécessaire). Pour PCRE ] - seulement besoin d'échapper dans une classe de caractères, mais je les ai gardés dans une seule liste pour la simplicité
  • Cité expression des chaînes de ont également les caractères de citation environnants échappé, et souvent avec des antislashes doublé-up (comme "(\")(/)(\.)" versus /(")(\/)(\.)/ en JavaScript)
  • mis à part les évasions, différentes implémentations de regex peuvent supporter différents modificateurs, classes de caractères, ancres, quantificateurs et autres caractéristiques. Pour plus de détails, consultez regular-expressions.info , ou utilisez regex101.com pour tester vos expressions en direct
42
répondu Beejor 2017-03-07 03:12:45

malheureusement il n'y a pas vraiment un ensemble de codes d'échappement car il varie en fonction de la langue que vous utilisez.

cependant, conserver une page comme la Regular Expression Tools Page ou cette Regular Expression Cheatsheet peut aller un long chemin pour vous aider à filtrer rapidement les choses.

20
répondu Dillie-O 2008-12-29 23:42:45

POSIX reconnaît de multiples variations sur les expressions régulières-expressions régulières de base (BRE) et expressions régulières étendues (ERE). Et même alors, il y a des bizarreries à cause des implémentations historiques des utilitaires standardisés par POSIX.

il n'y a pas de règle simple pour savoir quand utiliser quelle notation, ou même quelle notation utilise une commande donnée.

admirez Jeff Friedl Mastering Regular Expressions livre.

4
répondu Jonathan Leffler 2008-12-30 00:05:08

malheureusement, le sens de choses comme ( et \( sont échangés entre les expressions régulières de style Emacs 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 devez vraiment savoir quel style vous essayez de citer.

3
répondu Darron 2008-12-29 23:44:33

parfois, la simple évasion n'est pas possible avec les caractères que vous avez listés. Par exemple, l'utilisation d'un antislash pour échapper à un support ne va pas fonctionner du côté gauche d'une chaîne de substitution dans sed, à savoir

sed -e 's/foo\(bar/something_else/'

j'ai tendance à juste utiliser une définition de classe de caractère simple à la place, de sorte que l'expression ci-dessus devient

sed -e 's/foo[(]bar/something_else/'

qui fonctionne pour la plupart des implémentations regexp.

caractère BTW les classes sont des composants regexp assez vanille donc ils ont tendance à fonctionner dans la plupart des situations où vous avez besoin de caractères échappés dans regexps.

Edit: après le commentaire ci-dessous, j'ai juste pensé que je mentionnerais le fait que vous devez également tenir compte de la différence entre automates d'état finis et automates d'état non finis en regardant le comportement de l'évaluation regexp.

vous pourriez vouloir regarder "le livre de balle brillante" aka efficace Perl ( aseptisé lien Amazon ), en particulier le chapitre sur les expressions régulières, pour obtenir une sensation pour ensuite la différence dans le moteur de regexp types d'évaluation.

pas tout le monde est un PCRE!

quoi qu'il en soit, les regexp sont tellement clunky comparé à SNOBOL ! Maintenant que était un cours de programmation intéressant! Avec celui sur Simula .

Ah les joies d'étudier à UNSW à la fin des années 70! (- :

3
répondu Rob Wells 2017-06-20 22:51:10

vraiment, il n'y en a pas. il y a environ un demi-zillion de syntaxes regex différentes; elles semblent venir de Perl, D'EMACS/GNU, et D'AT&T en général, mais je suis toujours surpris aussi.

2
répondu Charlie Martin 2008-12-29 23:37:02

pour PHP, "il est toujours sûr de précéder un non-alphanumérique avec "\" pour spécifier qu'il représente pour lui-même."- http://php.net/manual/en/regexp.reference.escape.php .

Sauf si c'est un "ou". : /

pour échapper À la regex modèle des variables (ou partielle des variables en PHP utiliser preg_quote()

1
répondu zylstra 2013-10-03 08:33:51