Expressions régulières - noelno/dovelei GitHub Wiki

Bases

Une expression régulière est encadrée par des barres obliques, à la différence des chaînes de caractère qui sont entre guillemets.

Quand l'expression est suivie du fanion g, cela indique que la recherche de termes correspondants ne doit pas s'arrêter à la première correspondance : toutes les correspondances doivent être retournées.

/abc/ contient exactement la suite de caractères "abc"
Ex : abc dabcd dabc
Note : fonctionne aussi avec les nombres. /123/ fait matcher 4123, 1234…

/\d\d\d\d/ contient quatre chiffres à la suite.
\d est le joker des chiffres ("d" pour digit)
Ex : vato1234east 1664 11/07/2012
\D est le joker des non-chiffres.

/..../ contient quatre caractères à la suite, n'importe lesquels, même un espace.
Contrairement au caractère d qui une fois échappé avec une barre oblique inversée devient un métacaractère, . est d'office un métacaractère et devient un point normal une fois échappé avec une barre oblique.
/...\./ a une correspondance avec abc. et i11ad..

/[cmpt]/ contient l'un des caractères suivants : c, m, p et t.
/[cmpt]arie/ a une correspondance avec carie, marie, parie, otarie.

/[^c]arie/ ne correspond pas si le a est précédé d'un c, par exemple carie. Par contre marie, parie, otarie correspondent.

/[0-6][a-z]/ contient la suite de caractères suivantes :

  • un premier caractère qui est forcément soit 0, soit 1… jusqu'à 6 (n'importe quel chiffre de 0 à 6)
  • un deuxième caractère qui est une lettre minuscule non accentuée (n'importe quelle lettre de a à z)

6e et b2b correspondent, 6E et 6ème ne correspondent pas.

/[A-Za-z0-9_]/ correspond avec tout ce qui contient un caractère alphanumérique ASCII (de a à z sans accent) ou un tiret bas.
\w est le joker des caractères alphanumériques ASCII et du tiret bas. On pourrait donc écrire /[\w_]/ à la place de /[A-Za-z0-9_]/, mais c'est moins lisible.
\W est le joker des caractères non-alphanumériques, équivalent de /[^A-Za-z0-9_]/
Pour le support des caractères Unicode (lettres à accents, autres alphabets), il suffit d'utiliser le modificateur /u avec w+ : [\w-]+/u matche avec n'importe quelle suite de lettres de n'importe quelle langue et contenant éventuellement un tiret.

/\d{2,5}/ correspond quand il y a une suite de deux à trois chiffres.
767 et 8888 correspondent.
/\d{2,}/ correspond quand il y a une suite de deux chiffres minimum.
L'expression /\d\d\d\d/ vue plus haut peut être raccourcie à /\d{4}/.

/\d+/ correspond quand il y a entre 1 et une infinité de chiffres qui se suivent.
(/\d*/ correspond quand il y a entre 0 et une infinité de chiffres qui se suivent. N'importe quel caractère seul correspondrait, donc inutile.)
/[lo]+/ correspond quand il y a un enchaînement de caractères l et o.
Par exemple ok, lol, trololol et olllollololo correspondent.

Le métacaractère ? indique que le caractère qui le précède est optionnel.
Par exemple /[0-9]+ fichiers? trouvés?/ correspond avec "1 fichier trouvé" ou "54 fichiers trouvés".

Comme le point, le point d'interrogation doit être échappé avec une barre oblique inversée pour pouvoir être recherché en tant que point d'interrogation et pas comme caractère optionnel.

Le métacaractère \t correspond à une tabulation.
Le métacaractère \r correspond au retour chariot.
Le métacaractère \n correspond à une nouvelle ligne.
Le métacaractère \s est le joker des espaces normaux, tabulations, retours chariot, nouvelle ligne (mais pas des espaces insécables).

\S est le joker des caractères non espaces/tab/retours/nouvelle ligne. Il équivaut à [^\s]

/^abc/ indique que la chaîne doit commencer par abc
/abc$/ indique que la chaîne doit finir par abc
/^abc$/ indique que la chaîne entière vaut abc
Le caractère ^ sert donc à la fois de caractère d'exclusion (/[^a-i]/) et de caractère de début de chaîne, attention à ne pas confondre !

Avec le motif /abc/, "mon abcdaire est arrivé" aurait pour correspondance la portion "abc" du mot "abcdaire".
Si l'on voulait le mot complet il faudrait préciser le motif : /abc[a-z]+/
Si l'on voulait récupérer la partie du mot "abcdaire" sans le "abc", il faudrait utiliser l'opérateur de groupement : les parenthèses. /abc([a-z]+)/. Le groupe ciblé serait donc "daire".

Autre exemple : /([a-z0-9_]+)\.pdf$/ permet de vérifier si la chaîne est bien un nom de fichier pdf (en alphadécimal, sans accent, sans majuscule, et se termine par .pdf), et retourne en plus le nom de fichier sans extension. Correspond avec compte_rendu_commission_20170202.pdf (groupe "compte_rendu_commission_20170202")

Les groupes permettent aussi de délimiter les suites de caractères qui précèdent certains métacaractères comme ? ou *.
Par exemple pigeon et pigeonneau correspondent à /^pigeon(neau)?$/.

Les groupes sont imbricables :
/[A-Z][a-z]{2} \d{4}/ correspond avec May 2012, Feb 1977
/([A-Z][a-z]{2} (\d{4}))/ permet d'extraire à la fois l'ensemble et juste le mois.
/([A-Z][a-z]{2}) (\d{4})/ permet d'extraire le mois et l'année séparément.

La barre verticale permet de lister différents motifs possibles.
Par exemple "chiens", "chat" et "pigeons" correspondent à l'expression régulière /^(chien|chat|pigeon)s?/.

\b est le joker correspondant à l'extrémité d'un mot (le début ou la fin).
L'expression /\b\w+/ permet de sélectionner tous les mots de la chaîne.

Langages

En PHP :

  • preg_match($pattern, $subject, $matches) retourne 1 si le pattern fourni correspond, 0 s'il ne correspond pas, ou FALSE si une erreur survient. preg_match() ne retourne que la première occurence qui correspond (et ses groupes), dans $matches.
  • preg_match_all($pattern, $subject, $matches) fait la même chose que preg_match() mais retourne toutes les occurrences dans $matches
  • preg_replace($pattern, "$1 of $2", $subject) retourne la chaîne cible après avoir substitué le texte des occurences par un autre.
    $1 fait référence au premier groupe de l'expression régulière, $2 au deuxième… Cela permet par-exemple d'intervertir le texte des groupes, de l'encadrer avec des guillemets droits etc…

Sources