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
- Basic Regular Expressions
- Extended Regular Expressions
- extensions Perl
- ...
Syntaxe : les bases
- ^ et $ pour indiquer début et fin de texte
- . 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
- ? pour zéro ou une occurence du caractère précédent
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"