Regex sur voyelles non accentuées

Introduction

Les expressions régulières, ou regex en court, sont une technique commune de recherche d’information dans du texte, grâce à un formalisation d’une requête. Ici, nul besoin de base de données, de logiciels complexes ou d’un langage avancé. Il suffit d’avoir un texte (la source de données), et un logiciel avec une fonction recherche qui prend en compte les regex (c’est le cas de la plupart d’entre eux tels que Notepad++ par exemple).

Bien qu’il existe sur le web une quantité faramineuse de ressources sur les expressions régulières, j’ai toujours eu du mal à obtenir un mémo complet, en français. Finalement, je me le suis fait, et je le partage ici, en espérant qu’il puisse être utile à d’autres.

Note 1 : pour chaque option ou instruction, j’indique en gras le caractère mis en lumière par l’option ou l’instruction présentée.

Note 2 : des ressources complémentaires sont disponibles à la fin de l’article.

Informations de base

Dans la suite, on considère le délimiteur comme étant le caractère #. Le délimiteur indique le début et la fin d’un pattern regex à rechercher.

Les autres informations de base sont :

  • Recherche insensible à la casse : i. Par ex. : #Regex#i
  • Ou logique (OR) : | (pipe). Par ex. : #Reg|ex#
  • Début de chaîne : ^. Par ex. : #^Bonjour#
  • Fin de chaîne : $. Par ex. : #zéro$#
  • Classe simple : []. Par ex. : #gr[aio]s# va matcher avec « gras », « gris », ou « gros »
  • Intervalle de classe : [« début »-« fin »]. Par ex. :
    • [a-z] : lettre minuscule entre a et z
    • [A-Z] : lettre majuscule entre A et Z
    • Combinaison de classes : [a-zA-Z] : lettre
  • Négation de classe : ajouter ^ dans  la classe. Par ex. : [^0-9] signifie pas un chiffre.

D’un langage à un autre, il peut y avoir de légères variations dans les classes, les métacaractères ou certains patterns.

Attention à ne pas mettre d’espace, surtout dans une classe ! Sinon, cela signifie que l’espace est recherché dans la regex, ce qui peut porter à confusion. Dans ce cas, préférer la classe abrégée \s (voir section dédiée ci-dessous).

Quantificateurs

Les quantificateurs sont des caractères spéciaux des expressions régulières qui permettent d’influencer le nombre de fois qu’un pattern est recherché. Si placé derrière une lettre, le quantificateur s’applique sur cette lettre uniquement (et pas toute une chaîne). Si placé derrière une classe, il s’applique à toute la classe.

Types de quantificateurs

  • Pattern facultatif « restreint » (autorisé 0 ou 1 fois) : ?. Par ex. : #gr?ave# peut matcher avec « grave » et « gave« 
  • Pattern obligatoire (autorisé 1+ fois) : +. Par ex. : #[0-9]+# peut matcher avec au moins un chiffre (sans suite : pour une suite de 5 chiffres, il y aura 5 matches).
  • Pattern facultatif « large » (autorisé 0+ fois) : *. Par ex. : #[a-z]*# peut matcher avec toute lettre minuscule ou vide. Autre exemple : #[test]*# va matcher si le mot « test » est présent. Il y aura autant de matches que de mots « test« .
  • Répétition d’un pattern : (). Par ex. : #(ay)*# va matcher avec « ay« , « ayay« , « ayayay » etc.

Le dernier type de quantificateur est le nombre précis de répétitions : {x,y}, avec x et y des nombres, x < y et y facultatif.

  • {x} signifie x répétitions exactement. Par ex. : #[0-9]{5}# va matcher avec les répétitions de 5 chiffres exactement (comme un code postal français).
  • {x,y} signifie de x à y répétitions, bornes incluses. Par ex. : #[0-9]{10, 13}# va matcher avec les suites de chiffres de 10 à 13 répétitions (comme les formats de numéro de téléphone, en comptant le format international en 0033x).
  • {x,} signifie au moins x répétitions.

Exemples et équivalences

On peut placer un quantificateur derrière une classe : #[0-9]+# signifie « au moins 1 chiffre« . On peut également combiner classe, répétition de motif et quantificateur. Par ex. : #([0-9])+# signifie « toute suite d’au moins 1 chiffre« .

Il y a aussi une correspondance entre quantificateurs :

  • Le caractère ? signifie aussi {0, 1}
  • Le caractère + signifie aussi {1,}
  • Le caractère * signifie aussi {0,}

Métacaractères des expressions régulières

Les métacaractères sont les caractères spéciaux des expressions régulières (voir les sections au-dessus). Par exemple le dièze « # » est le délimiteur d’une regex.

Pour pouvoir les avoir dans une regex, en tant que caractère recherché, il faut les « échapper », avec un métacaractère : l’antislash \.

Liste des métacaractères : # ! ^ $ ( ) [ ] { } ? + * . \ |

Dans une classe [ ], il n’est pas nécessaire d’échapper un métacaractère, sauf :

  • # : car indique la fin d’une regex,
  • ] : car indique la fin d’une classe,
  • «  » (tiret du 6) : car indique un intervalle de caractère, dans la classe (par exemple les chiffres : [09]).

Classes abrégées les plus courantes (raccourcis)

  • \d signifie [0-9] : caractère qui est un chiffre
  • \D signifie [^0-9] : inverse de \d (= n’est pas un chiffre)
  • \w signifie [a-zA-Z0-9_] : caractère qui fait partie d’un mot (incluant chiffres et underscore)
  • \W signifie [^a-zA-Z0-9_] : inverse de \w (= ne fait pas partie d’un mot)
  • \t indique une tabulation
  • \n indique une nouvelle ligne
  • \r indique un retour chariot
  • \s indique un espace blanc
  • \S : inverse de \s (= équivalent à \t\n\r)
  • . : (le point) indique n’importe quel caractère, donc autorise tout sauf \n

Variables dans les regex

Les parenthèses sans indication de quantité juste après elles définissent des « variables capturantes ».

Par exemple, dans la regex suivante :

#(anti)co(nsti)(tu(tion)nelle)ment#

Il y a 4 variables :

  • $1 : (anti)
  • $2 : (nsti)
  • $3 : (tu(tion)nelle)
  • $4 : (tion)

Il peut y avoir jusqu’à 99 variables par regex (en JavaScript). L’ordre ascendant des variables suit l’ordre d’ouverture des parenthèses, de gauche à droite.

La variable $0 (d’index 0) indique la regex complète.

Pour échapper une variable, c’est-à-dire chercher un motif sans le comptabiliser dans les résultats (utile pour vérifier la présence d’un motif sans toutefois l’afficher ou le récupérer) :

(?:contenu)

Par ex. : (?:nsti) cherche le motif « nsti » mais ne crée pas de variable.

Ressources complémentaires

Exemple d’une regex isolant les voyelles non accentuées sur le site regexr.com

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *