Dans une expression régulière, quels caractères doivent s'échapper?

En général, quels caractères dans une expression régulière doivent-ils s'échapper?

Par exemple, ce qui suit n'est pas syntaxiquement correct:

echo '[]' | grep '[]' grep: Unmatched [ or [^ 

Ceci, cependant, est syntaxiquement correct:

 echo '[]' | grep '\[]' [] 

Existe-t-il une documentation sur les caractères qui devraient être échappés dans une expression régulière, et lesquels ne devraient pas?

Cela dépend de l'application. Dans votre exemple [ doit être cité comme argument pour grep mais pas pour echo .

Pour le shell (à partir des spécifications POSIX ):

Le fait de citer est utilisé pour supprimer la signification spéciale de certains caractères ou mots sur le shell. La mise en citation peut être utilisée pour préserver la signification littérale des caractères spéciaux du paragraphe suivant, empêcher que les mots réservés soient reconnus comme tels et empêcher l'extension des parameters et la substitution des commands dans le traitement du document.

L'application doit citer les caractères suivants s'ils veulent se représenter:

 | & ; < > ( ) $ ` \ " ' <space> <tab> <newline> 

et les éléments suivants peuvent devoir être cités dans certaines circonstances. Autrement dit, ces caractères peuvent être spéciaux en fonction des conditions décrites ailleurs dans ce volume d'IEEE Std 1003.1-2001:

 * ? [ # ˜ = % 

Les différents mécanismes de citation sont le caractère d'échappement, les guillemets simples et les guillemets doubles. Le présent document représente une autre forme de citation; voir ici-document.

Des programmes spécifiques (utilisant des regex, perl, awk) pourraient avoir des exigences supplémentaires pour s'échapper.

Chaque application aura son propre set de caractères «spéciaux». Le problème que vous avez rencontré était avec grep pas le shell. Pour quels caractères doivent être cités dans grep , lisez la section de la page de manuel sur "EXPRESSIONS RÉGULIERS".

Pour le shell, les caractères qui doivent être cités sont:

 ;'"`#$&*?[]<>{}\ 

et tout espace blanc.

Selon le shell, d'autres caractères peuvent également être cités:

 !^% 

Regardez sous "SHELL GRAMMAR" sur la page de manuel du shell.

Il existe plusieurs types d'expressions régulières et l'set des caractères spéciaux dépend du type particulier. Certains d'entre eux sont décrits ci-dessous. Dans tous les cas, les caractères spéciaux sont échappés par une barre oblique inverse \ . Par exemple, pour correspondre à [ vous écrivez \[ place. Alternativement, les caractères (sauf ^ ) pourraient être échappés en les enfermant entre crochets un par un comme [[] .

Les caractères qui sont spéciaux dans certains contexts comme ^ special au début d'une (sous-) expression peuvent être échappés dans tous les contexts.

Comme d'autres l'ont écrit: dans le shell si vous ne placez pas l'expression entre guillemets simples, vous devez en outre échapper les caractères spéciaux pour le shell dans l'expression regex déjà échappée. Exemple: Au lieu de '\[' vous pouvez écrire \\[ (alternativement: "\[" ou "\\[" ) dans les coquilles compatibles Bourne comme bash mais ceci est une autre histoire.

Expressions régulières de base (BRE)

  • POSIX: Expressions régulières de base
  • Commandes: grep , sed
  • Caractères spéciaux:. .[\
  • Spécial dans certains contexts: *^$
  • Échapper à une string: "$(printf '%s' "$ssortingng" | sed 's/[.[\*^$]/\\&/g')"

Expressions régulières étendues (ERE)

  • POSIX: Expressions régulières étendues
  • Commandes: grep -E , GNU: sed -r , * BSD: sed -E
  • Caractères spéciaux:. .[\(
  • Spécial dans certains contexts: *^$)+?{|
  • Échappez une string: "$(printf '%s' "$ssortingng" | sed 's/[.[\*^$()+?{|]/\\&/g')"

grep utilise BRE comme méthode regex. Il y a une bonne documentation à ce sujet, un récapitulatif général serait "échapper à un caractère spécial ou un métacaractère pour get son littéral, s'échapper pour créer des séquences d'échappement ( \n , \r , etc)", bien que cela ne soit pas toujours vrai , vous devez vous échapper ( et ) pour get leur signification spéciale (reference arrière).