Introduction
Les expressions régulières sont très puissantes, mais elles sont difficiles à lire et souvent on ne profite pas de leur plein potentiel à cause de ça.
Lorsqu’on utilise les expressions régulières pour la validation d’un formulaire, on aimerait parfois pouvoir vérifier plusieurs critères avec une seule regex.
Par exemple, on pourrait demander à un numéro de téléphone de contenir au moins dix chiffres ET de contenir seulement certains caractères.
On ne sait pas forcément qu’elles nous permettent de faire précisément ça, et bien d’autres choses incroyables !
Ce que nous voulons c’est que notre chaine de caractères corresponde à un numéro de téléphone (français) typique, avec ou sans son préfixe international.
Ça pourrait prendre l’une de ces formes :
01 23 45 67 89
01.23.45.67.89
+33-123.456.789
+(33)1 234-567-89
ou d’autres variations.
Simplement, ce que nous voulons c’est au moins dix chiffres, et seulement des nombres, espaces, tirets et points, éventuellement précédés par un + et un jeu de parenthèses autour de deux chiffres (le code international).
Comme d’habitude, nous allons commencer par un exemple complet, puis le détailler.
Voici à quoi ça ressemble pour notre exemple :
/^\+{0,1}(?=(?:\D*\d){10}$)[\d .()-]+$/
Comment avons-nous construit ceci ?
Les parties
On peut utiliser
/^\+{0,1}/
pour dire que notre chaine de caractères peut commencer (^) par un + (échappé pour conserver sa signification littérale) 0 ou 1 fois.
On peut aussi utiliser
/(\D*\d){10}$/
pour dire que l’on veut qu’elle finisse ($) par 10 occurrences d’un chiffre (\d) avec n’importe quels autres caractères non numériques (\D*)
Ici nous vérifions simplement que l’on a 10 chiffres dans notre chaine de caractères.
En outre, on pourrait utiliser
/[\d .()-]+$/
pour forcer la chaine de caractères à se terminer ($) par seulement des nombres (\d) et certains caractères choisis.
On n’a pas besoin d’échapper le point ou les parenthèses ici. Comme ils sont entre crochets, il sont toujours utilisés littéralement.
Par contre, le tiret (-) a une signification spéciale au sein des crochets : il sert à déclarer des intervalles comme [a-z]. Ici, on n’a pas besoin de l’échapper par ce que c’est le dernier caractère. Si ce n’était pas le cas, il faudrait l’échapper.
C’est à dire qu’on pourrait écrire la même chose comme ceci : [\d .\-()]+
L’ingrédient principal
Afin de cumuler les deux dernières règles dans une seule regex, on utilise le positive lookahead.
Tout ce qu’il vous faut savoir est que sa syntaxe est un point d’interrogation suivit par un signe égal au début d’un jeu de parenthèses, c’est à dire (?=…)
Sa fonction est de vérifier que la suite de la chaine de caractères correspond à une expression régulière donnée (sans inclure cette partie pour référence ultérieure).
Le « positive lookahead » est là où la magie se passe. C’est un peu comme si ce n’était pas vraiment une partie de l’expression régulière, sauf que ça crée tout de même une contrainte. Ça veut dire que l’on peut cumuler d’autres règles comme si celle-ci n’avait jamais existé !
On a aussi ajouté un point d’interrogation suivi de deux-points (?:…) au début du jeu de parenthèses au sein de notre « lookahead » mais c’est optionnel. Cette instruction est là pour dire que ce jeu de parenthèses aussi ne doit pas créer de référence pour un usage ultérieur. Ça ne change pas grand chose, mais ça aidera le moteur d’expressions régulières à aller un petit peu plus vite (au détriment de la lisibilité). A vous de voir.
Cumuler le tout
Revenons à notre premier bout de code, voici ce qu’il fait
/^\+{0,1}(?=(?:\D*\d){10}$)[\d .()-]+$/
Il recherche d’abord un + au début de la chaine de caractères testée, qui peut ne pas être présent ou être présent une seule fois: ^\+{0,1}
Ensuite, il vérifie « plus loin » qu’on trouve à la fin de la chaine une série de 10 chiffres mélangée avec d’autres caractères, sans conserver la trace de leur existence: (?=(?:\D*\d){10}$)
Enfin, il reprend où il en était en vérifiant que la chaine testée contient uniquement des chiffres, espaces, parenthèses et tirets jusqu’au bout: [\d .()-]+$
J’espère que ça vous sera utile !

please help
^ to + n $
what s mean?
I’m not sure exactly what you mean, but ^ represents the beginning of the matched string and $ represents its end