Introduction aux expressions rationnelles

Adrien Kunysz

Qu'est-ce que c'est ?

  • Une notation compacte permettant de décrire des ensembles de chaînes de caractères ;
  • exemples (dictionnaire) :
    • tous les mots qui finissent par « er » : er$
    • tous les mots qui ne commencent pas par « a » ou « b » : ^[^ab]
    • tous les mots qui contiennent « be » précédé d'au moins deux caractères : ^.{2,}be

Comment est-ce utilisé ?

  • dans les langages de programmation :
    • intégré (Perl,...)
    • bibliothèque externe (C, Java,...)
  • dans les fichiers de configuration (mod_rewrite,...)
  • dans les éditeurs de texte
  • dans les programmes de manipulation de texte (grep, sed,...)

Plusieurs versions

  • POSIX
    • Simple Regular Expressions
      • obsolète
    • Basic Regular Expressions
      • grep sans -E
    • Extended Regular Expressions
      • le plus courant
  • extensions Perl
  • ...

Syntaxe : les bases

  • ^ et $ pour indiquer début et fin de texte
    • ^foo
    • bar$
    • ^foobar$
  • . pour indiquer n'importe quel caractère
    • foo.bar -> fooXbar, foo bar,...
  • | pour permettre l'un ou l'autre
    • foo|bar|baz -> foo, bar, baz

Syntaxe : les répétitions

  • * pour zéro à n occurences du caractère précédent
    • foo* -> fo, foo, fooo,...
  • + pour une à n occurences du caractère précédent
    • fo+ -> fo, foo, fooo,...
  • ? pour zéro ou une occurence du caractère précédent
    • foo? -> fo, foo

Syntaxe : les répétitions (2)

  • {m,n} pour m à n répétitions du caractère précédent
    • fo{2} -> foo
    • fo{1,} -> fo, foo, fooo,...
    • fo{0,2} -> f, fo, foo

Syntaxe : les groupements

  • ( et ) pour grouper des caractères, \1 pour le premier groupement
    • foo(bar)* -> foo, foobar, foobarbar,...
    • f(.)\1 -> foo, fbb, fxy,...
    • (bar){1,}f(.)\2 -> barfoo, barbarfbb, barfab,...
  • [ et ] pour permettre plusieurs caractères
    • f[o0]{2}ba[rz] -> foobar, f0obaz,...
    • interdire des caractères : fo[^o0] -> fon, foo, foq, fo0,...
    • intervalle : [a-z][A-Z][0-9] -> xV4, eU7,...
    • groupement : f[xy[.oo.]] -> fx, fy, foo
    • classes : x[[:space:][:upper:]]z -> x z, xYz,... (man 3 wctype)

Options

  • REG_ICASE (i) : ne pas tenir compte de la casse
  • REG_NEWLINE (m) : ^ et $ correspondent aux débuts et fin de ligne, les retours à la ligne ne sont pas compris dans .

Extensions Perl : classes

  • classes abrégées :
    • \w -> [a-zA-Z0-9_]
    • \d -> [[:digit:]]
    • \s -> [[:space:]]
    • en majuscule pour inverser : \D -> [^[:digit:]]
  • négation de classe :
    • [\w[:^digit:]] -> [a-zA-Z_]

Extensions Perl : gourmandise

  • $1 à la place de \1
  • ?, +, * et {m,n} sont gourmands par défaut : "The programming republic of Perl" =~ /^(.+)(e│r)(.*)$/ -> $1 = "The programming republic of Pe", $2 = "r", $3 = "l"
  • ??, +?, *?, {m,n}? pour les faire correspondre à la plus petite portion possible : "The programming republic of Perl" =~ /^(.+?)(e|r)(.*?)$/ -> $1 = "Th", $2 = "e", $3 = " programming republic of Perl"

Références