User Tools

Site Tools


informatique:regexp

Expressions régulières

Les expressions régulières, ou expressions rationnelles, ou motifs (ou même regexp en anglais), sont une suite de caractères issues de la logique (mathématique), qui permettent de décrire des chaînes de caractères. Il existe différentes notations, bien qu'elles se ressemblent beaucoup : POSIX, PCRE (Perl-Compatible Regular Expressions), Python, etc… (plus de détails sur wikipedia)

Penser à consulter un testeur d'expression régulière, comme l'excellent regex101, ou le visualiseur jex.im.

Syntaxe

[]  définissent une liste de caractères
()  définissent un élément composé de l'expression régulière qu'elle contient (un bloc)
    (?: parenthèses non capturantes
    (?= motif obligatoire
{}  contiennent un ou plusieurs chiffres séparés par des virgules, qui indiquent le nombre d'occurence
    attendu de l'élément précédant les accolades (par exemple p{3,5} correspond à ppp, pppp ou ppppp)
-   défini un intervalle (par exemple [a-d] équivaut à [abcd])
.   représente un caractère unique
*   zéro ou plusieurs
+   un ou plusieurs
?   zéro ou un
|   OU (lard|cochon)
^   Placé en début d'expression il signifie "chaîne commençant par .. "
    Utilisé à l'intérieur d'une liste c'est un "non"
$   Placé en fin d'expression il signifie "chaîne finissant par .. "

Les parenthèses sont capturantes par défaut, ce qui veut dire que ce qu'elles matchent peut être récupéré ensuite dans des variables. Par exemple:

echo "je suis heureux" | sed 's/.* \([^ .]*\)/\1 je suis/'
 heureux je suis

les parenthèses \(\) encadrent le motif qui matche le dernier mot de la phrase, que l'on récupère ensuite avec la variable \1 (parce que c'est la première parenthèse capturante ; ça marche aussi avec \2, \3, etc…

Si on veut utiliser des parenthèses dans une regexp mais que l'on ne veux pas récupérer leur contenu, on gagne en performance en les déclarant non capturantes, en préfixant leur contenu par ?: :

echo "je suis heureux" | sed 's/.* \(?:[^ .]*\)/\1 je suis/'

(?=truc) indique que le motif “truc” doit être trouvé pour valider l'ensemble de l'expression régulière (voir exemple du mot de passe plus bas).

Les classes de caractères prédéfinis

Ils se caractérisent pas la notation [:classe:] :

[:alnum:]  caractères alphanumériques (équivalent à [A-Za-z0-9])
[:alpha:]  caractères alphabétiques ([A-Za-z])
[:blank:]  caractères blancs (espace, tabulation)
[:ctrl:]   caractères de contrôle (les premiers du code ASCII)
[:digit:]  chiffres ([0-9])
[:graph:]  caractères d'imprimerie (affichage à l'écran en quelque sorte)
[:lower:]  caractères minuscules ([a-z])
[:print:]  caractères imprimables (tout sauf les caractères de contrôle)
[:punct:]  caractères de ponctuation
[:space:]  caractères d'espacement
[:upper:]  caractères majuscules ([A-Z])
[:xdigit:] caractères hexadécimaux

Cheat sheets

Exemples

  • matcher chaque ligne qui ne contient pas le MOTIF (exclure le motif)
^((?!MOTIF).)*$
 
# alt : ne pas matcher les lignes qui commencent par MOTIF :
^(?!MOTIF).*$

src stackoverflow : Regular expression to match a line that doesn't contain a word

  • Valider une URL :
^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \?=.-]*)*\/?$
  • Valider une adresse IPv4
((^|\.)((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]?\d))){4}$
  • Valider un mot de passe de 8 caractères minimum, contenant au moins un chiffre, une minuscule, une majuscule, et un caractère spécial :
^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=.\-_*])([a-zA-Z0-9@#$%^&+=*.\-_]){8,}$
  • valider une adresse email selon le RFC 5322 (source : regex101)
/(?(DEFINE)
    (?<addr_spec> (?&local_part) @ (?&domain) )
    (?<local_part> (?&dot_atom) | (?&quoted_string) | (?&obs_local_part) )
    (?<domain> (?&dot_atom) | (?&domain_literal) | (?&obs_domain) )
    (?<domain_literal> (?&CFWS)? \[ (?: (?&FWS)? (?&dtext) )* (?&FWS)? \] (?&CFWS)? )
    (?<dtext> [\x21-\x5a] | [\x5e-\x7e] | (?&obs_dtext) )
    (?<quoted_pair> \\ (?: (?&VCHAR) | (?&WSP) ) | (?&obs_qp) )
    (?<dot_atom> (?&CFWS)? (?&dot_atom_text) (?&CFWS)? )
    (?<dot_atom_text> (?&atext) (?: \. (?&atext) )* )
    (?<atext> [a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+ )
    (?<atom> (?&CFWS)? (?&atext) (?&CFWS)? )
    (?<word> (?&atom) | (?&quoted_string) )
    (?<quoted_string> (?&CFWS)? " (?: (?&FWS)? (?&qcontent) )* (?&FWS)? " (?&CFWS)? )
    (?<qcontent> (?&qtext) | (?&quoted_pair) )
    (?<qtext> \x21 | [\x23-\x5b] | [\x5d-\x7e] | (?&obs_qtext) )
    # comments and whitespace
    (?<FWS> (?: (?&WSP)* \r\n )? (?&WSP)+ | (?&obs_FWS) )
    (?<CFWS> (?: (?&FWS)? (?&comment) )+ (?&FWS)? | (?&FWS) )
    (?<comment> \( (?: (?&FWS)? (?&ccontent) )* (?&FWS)? \) )
    (?<ccontent> (?&ctext) | (?&quoted_pair) | (?&comment) )
    (?<ctext> [\x21-\x27] | [\x2a-\x5b] | [\x5d-\x7e] | (?&obs_ctext) )
    # obsolete tokens
    (?<obs_domain> (?&atom) (?: \. (?&atom) )* )
    (?<obs_local_part> (?&word) (?: \. (?&word) )* )
    (?<obs_dtext> (?&obs_NO_WS_CTL) | (?&quoted_pair) )
    (?<obs_qp> \\ (?: \x00 | (?&obs_NO_WS_CTL) | \n | \r ) )
    (?<obs_FWS> (?&WSP)+ (?: \r\n (?&WSP)+ )* )
    (?<obs_ctext> (?&obs_NO_WS_CTL) )
    (?<obs_qtext> (?&obs_NO_WS_CTL) )
    (?<obs_NO_WS_CTL> [\x01-\x08] | \x0b | \x0c | [\x0e-\x1f] | \x7f )
    # character class definitions
    (?<VCHAR> [\x21-\x7E] )
    (?<WSP> [ \t] )
)
^(?&addr_spec)$/xmg
informatique/regexp.txt · Last modified: 2020/05/24 12:02 by pteu