mercredi 27 juillet 2016 (), par
Que ce soit sous Linux Bash (sed, grep, find...), PHP (preg_match et preg_replace) ou Perl, il est possible de simplifier des traitements en faisant correspondre une chaîne à un motif (pattern).
Certains motifs utilisent des expressions régulières étendues, nécessitant une option (-r pour sed, -E pour grep...) ou un paramétrage à vérifier (PHP/Perl).
Article non exhaustif
Les caractères spéciaux (^, $, ?, +, *, [ , ], (, )...) seront protégés par un \
afin de ne pas être interprétés
Les composantes d’une expression régulière sont :
^
pour le début de la chaîne$
pour la fin de la chaîne.g
permettra un traitement pour chaque correspondance au motif..
signifie "n’importe quel caractère". Un "." simple devra être protégé par un \
[ ]
- valable pour un seul caractère à comparer. Il faudra utiliser des quantificateurs pour comparer plusieurs caractères.
[ ]
, le ^
indique une négation. Ainsi, [^0-9]
signifie "tout sauf numérique"[0-9]
pour du numérique.[a-z]
pour de l’alphabétique en minuscule[A-Z]
pour de l’alphabétique en majuscule[a-zA-Z0-9]
pour de l’alphanumérique.[abcdef567]
ou de mettre une liste implicite [a-f5-7]
[-09]
\d
est ainsi l’équivalent de [0-9]
et \w
celui de [a-zA-Z0-9]
, \s
un caractère d’espacement (espace, tabulation...), \t
une tabulation simple, \b
indique un séparateur de mot...\D
étant tout sauf numérique.i
, juste en dehors de l’expression régulière( )
- permettent de comparer une .. sous-chaîne, pouvant être composée de plusieurs expressions
^(Q|q)$
correspond à un q majuscule ou minuscule, le "ou" logique étant représenté par |
. C’est l’équivalent de ^[qQ]$
^(perl|linux|php)$
à la chaîne entière "perl" OU "linux" ou "php". contrairement à la notation [ ]
, la comparaison se fait sur plusieurs caractères.^Mem(Free|Total):
cherche en début de chaîne "MemFree :" ou "MemTotal :"$patterns["max_essais_logins"]="/^[a]{0}(0*[3-9]|(0*[1-9]0*)+0|(0*[1-9]+0*)+[1-9])$/";
qui contrôle une chaîne numérique supérieure à 3.
[a]{0}
sépare le ^
de la sous-chaîne, afin de le comprendre comme "début de chaîne globale" et non "différent de sous-chaîne qui suit".^(valeur1|valeur2)
s/^.+: +([0-9]+) kB/$1/
via un remplacement, extrait de la chaîne les seuls caractères numériques situés avant un " kB", et ce pour la première occurrence dans la ligne.?
signifie "zéro ou 1 fois"*
signifie "zéro à n fois" (sans limite)+
signifie "au moins 1 à n fois"{a,b}
signifie "de a à b fois". a ou b peuvent être absents, afin de ne spécifier que le maximum ou minimum.
{0,}
est un équivalent de *
^(\.|\.\.)$
, afin de ne pas traiter "." et ".." dans la liste des répertoires Unix/Linux, peut être remplacé par ^\.{1,2}$
ou ^\.\.?$
/
, les options s’indiqueraient de manière "/motif/options"
preg_match("/^linux/i",$chaine)
sera insensible à la casse et cherchera en début de chaîne le terme "linux" avec ou sans majuscules.if (preg_match("/[\w]+/",$param)){ $typ_param=PDO::PARAM_STR; }
si la chaîne contient (peut importe où) un voire plus caractères alphabétiques, c’est une chaîne de caractères
\w
peut être remplacé par \D
, signifiant "tout sauf numérique". Ici, l’expression est assez permissive car c’est le type "par défaut", qui peut être surchargé par les deux suivants.if (preg_match("/^[+-]?\d+$/",$param)){ $typ_param=PDO::PARAM_INT; }
si la chaîne ne contient, du début à la fin, qu’un (ou pas) +/- suivi d’un ou plusieurs caractères numériques, c’est un entier signéif (preg_match("/^$/",$param)){ $typ_param=PDO::PARAM_NULL; }
si la chaîne, entre son début et sa fin, ne contient rien, c’est un paramètre null$patterns["max_essais_logins"]="/^[a]{0}(0*[3-9]|(0*[1-9]0*)+0|(0*[1-9]+0*)+[1-9])$/";
^
comme "début de chaîne" et non "non égal à la sous-chaîne qui suit"0*[3-9]
soit (0*[1-9]0*)+0
soit (0*[1-9]+0*)+[1-9]
répété au moins une fois, et termine0*[3-9]
= un chiffre de 3 à 9 tout seul, précédé ou non de zéros.(0*[1-9]0*)+0
= une chaîne contenant au moins un chiffre de 1 à neuf, et qui terminera par zéro(0*[1-9]+0*)+[1-9]
= une chaîne contenant au moins un chiffre de 1 à neuf, et qui terminera par un chiffre de 1 à neuf, donc complémentaire à la chaîne précédente=~
et !~
permettent de comparer le contenu d’une variable à un motif.$page=(isset($_POST["page"]))?$_POST["page"]:"accueil";
affecte à la variable page la valeur transmise en POST si celle-ci existe, sinon la valeur "accueil".($valeur=~/^[+-]{0,1}[0-9]+$/)?push(@rray,$valeur):last;
s/<\/{0,1}head>//gi;
le s indique que l’on remplace (substitute) la chaîne </head>
ou <head>
(le / étant protégé), par une chaîne vide, avec les options g (global, ne pas s’arrêter à la première occurrence) et i (insensible à la casse)3\.14(15?)?
3.14 ET 3.141 ET 3.1415(ab)([c]{0,1}|[c]{3})z
abz ET abcz ET abcccz(abc)[c]{2}z
abcz ET abcccz MAIS PAS abz(ab)[c]{0,1}z
abz ET abcz[\\]*[\*]*
un nombre quelconque de “\” suivi d’un nombre quelconque de “*”([^"]*)
une chaîne entre quotes contenant 0 à n fois tout sauf "^0?[0-3]?[0-7]{1,2}$
commence par 0 (0 ou 1 fois) puis 0 à 3 (0 ou 1 fois) puis 0 à 7 (1 ou 2 fois) et termine\b[\w.]{1,12}\b
un mot de 1 à 12 caractères alphanumériques ou "."^\$\w+$
une chaîne contenant uniquement le nom d’une variable scalaire sans toutefois correspondre à une variable spéciale comme $*
(PERL)^(#.*|\s*)$
une chaîne commençant par soit un dièse suivi de n’importe quoi en n’importe quelle quantité soit ne contenant (éventuellement) que des caractères de séparation, jusqu’à la fin de la chaîne. un \s*#
au lieu du simple #
permettrait de gérer les lignes de commentaires commençant par des caractères d’espacement.