Créer une regex
Avant de se lancer...
Pour tester une regex, nous allons utiliser la méthode nommée
test de cet objet, qui s'utilise ainsi :
Code : JavaScript1 | var verifie = maRegex.test(str);
|
Si la chaîne de caractères
str vérifie la regex
maRegex, alors
verifie vaut
true, sinon il vaut
false.
Une regex... pourquoi ?!
C'est bien beau, mais comment ça fonctionne ?
Ça veut dire quoi "
vérifier une regex" ?
Si on devait formuler une phrase pour décrire les regex, ce serait celle-ci :
Citation : les regexL'utilisation des regex consiste à chercher un motif dans la chaîne de caractères.
Avec
test, on récupère simplement
true si le motif est trouvé dans la chaîne de caractères,
false sinon.
Mais on peut également récupérer les morceaux de chaînes qui satisfont le motif, ou encore les remplacer par autre chose.
Pour l'instant, sachez qu'une chaîne de caractères est un motif.
Nous verrons des motifs plus évolués un peu plus loin dans ce chapitre, c'est justement son but.
Première regex
Il est maintenant temps de créer une première regex...
Sachez qu'il y a pour cela deux façons, qui reviennent au même.
La première, grâce à laquelle on voit bien que
RegExp est une classe d'objet :
Code : JavaScript1 | var maRegex = new RegExp("motif", "flags");
|
La seconde, dont la syntaxe est moins lourde :
Code : JavaScript1 | var maRegex = /motif/flags;
|
Il y a des guillemets dans le premier cas, mais pas dans le second !
Le paramètre flags est facultatif (dans les deux cas).
On essaie !
Essayons donc sans plus tarder :
Code : JavaScript1
2
3 | var reg = new RegExp("toto");
var resultat = reg.test("toto");
alert(resultat);
|
Ce qui affiche
true, normal

.
Deuxième essai, avec la même regex :
Code : JavaScript1
2
3 | var reg = /toto/;
var resultat = reg.test("Bonjour toto !");
alert(resultat);
|
Ce qui affiche également
true, car la chaîne de caractères qui forme le motif (c'est "
toto") a été trouvée dans notre phrase (qui est
"Bonjour toto !").
Une regex un peu plus évoluée
Les flags
Comme nous l'avons dit, une regex est constitué de deux choses :
- un motif, qui sera recherché dans les chaînes de caractères auxquelles on appliquera notre regex,
- des flags, qui sont des options supplémentaires.
Revenons sur ces derniers, qui ne devraient pas vous poser de difficultés.
Ils sont au nombre de trois :
- i, pour rechercher le motif sans tenir compte de la casse (des majuscules / minuscules),
- g, signifiant "global", dont on précisera l'utilisation en temps voulu (quand on parlera des fonctions utilisant les regex),
- gi = g + i
(pour combiner les deux options).
Des symboles bizarres
Maintenant que vous savez tout des
flags, concentrons-nous sur les motifs, car c'est une autre paire de manches

.
Des symboles particuliers vont nous aider à rendre nos motifs beaucoup plus évolués.
Vous verrez, avec tous ces symboles, un motif complet ressemble à du martien.
Le premier symbole est
| (la barre verticale) et signifie
OU.
Par exemple, pour vérifier si la chaîne contient sdz ou SdZ (avec ces majuscules) :
/sdz|SdZ/
Cette regex vérifie "
Vive le SdZ !" et "
Je suis sur le sdz", mais pas "
Le SDZ ?".
On peut utiliser des parenthèses pour délimiter :
/(st|h|p)op/ est vérifié par "
stop !", "
Le shopping", "
pop-up", mais pas par "
flop".
Le symbole suivant est
. (le point), qui signifie "n'importe quel caractère".
Ainsi,
/o.o/i (notez le flag
i pour ignorer la casse) sera satisfaite par : "
o,O", "
Toto" et "
automobile".
Début et fin de chaîne
Deux symboles nous permettent de délimiter le début et la fin de la chaîne de caractères : ce sont respectivement
^ et
$.
Par exemple,
/^Bonjour/ sera satisfaite uniquement avec une phrase commençant par "
Bonjour", comme "
Bonjour monsieur", mais pas par "
Hey ! Bonjour toi !".
Autre exemple,
/!$/ va vérifier si une phrase se termine par un point d'exclamation, comme "
Hey ! Bonjour toi !", mais pas comme "
Toto ?!?"
Encore plus de symboles
Les classes
Il est également possible de définir, au lieu d'un seul caractère, une
liste de caractères (appelée
classe de caractères), en les indiquant entre crochets
[].
Avec
/t[iaot]c/, on peut ainsi filtrer "
Et toc !", "
Tic, tac...", "
25? ttc", mais pas "
tuc".
À l'intérieur d'une classe, il est possible d'utiliser le tiret pour définir une
plage de valeur :
[i-n] équivaut à
[ijklmn], et
[0-9A-F] à
[0123456789ABCDEF].
On peut ainsi chercher si une phrase se termine par une lettre ou un chiffre avec
/[a-zA-Z0-9]$/, vérifiée par "
Bonjour", "
BOB" et "A
gent 007", mais pas par "
Non." ni "
(-_-)".
Inversement, on peut définir une classe en indiquant les caractères qui ne doivent pas y figurer, grâce à
^ placé au début de cette classe.
Exemple : pour détecter les phrases qui ne se terminent pas par une lettre, on peut utiliser
/[^a-zA-Z]$/, que vérifie "
Agent 007" mais pas "
Toto".
Attention à ne pas confondre les deux utilisations de
^ !
- Au début d'une classe (entre crochets), il indique quels caractères ne font pas partie de cette classe.
- En dehors des crochets, il indique le début de la chaîne de caractères.
Classes existantes
Certaines classes très utilisées sont déjà définies : en voici les principales.
| Nom | Équivalent | Description |
|---|
| \d |
[0-9] |
Un chiffre |
| \D |
[^0-9] |
Caractère qui n'est pas un chiffre |
| \w |
[a-zA-Z0-9_] |
Caractère alpha-numérique, ou underscore |
| \W |
[^a-zA-Z0-9_] |
Caractère non alpha-numérique (autre que underscore) |
| \s |
|
Caractère "blanc" (espace, saut de ligne, tabulation, etc.) |
| \S |
|
Caractère "non-blanc" |
| \b |
|
Début / fin de mot (début de chaîne, espace, etc.) |
| \B |
|
Ni début ni fin de mot |
Dans une chaîne de caractères, l'antislash est déjà utilisé pour les caractères spéciaux. Ainsi, si vous utiliser la notation
new RegExp("motif"),
il faut faire précéder chaque antislash d'un... antislash.
Voyez plutôt : les deux regex suivantes sont identiques :
Code : JavaScript1
2 | var regex1 = /\d/;
var regex2 = new RegExp("\\d");
|
Les quantificateurs
Il est possible de préciser le nombre de fois que doit se répéter un "bout de motif".
Quantifier "manuellement"
On peut préciser, entre accolades
{}, le nombre de fois qu'un caractère / groupe de caractères doit se répéter.
Dans cet exemple, on veut filtrer "
foot" avec deux "o" :
/fo{2}t/
Il est possible d'indiquer une plage de valeur : on demande au groupe de caractères de se répéter au minimum
i fois, et au maximum
j fois, avec
{i,j}.
Par exemple,
/bo{2,5}m/ cherchera "
boom" avec 2, 3, 4 ou 5 "o".
Notez que la valeur supérieure est facultative.
Ainsi,
/bo{2,}m/ sera validé par "
boom" et par "
boooooom" : avec 2 "o" ou plus.
D'autres symboles pour quantifier
Il existe les symboles
? * et
+ en guise de "raccourcis".
| Nom | Équivalent | En français |
|---|
| ? |
{0,1} |
0 ou 1 fois |
| * |
{0,} |
N'importe quel nombre de fois |
| + |
{1,} |
Au moins une fois |
Symbole utilisé = symbole à échapper !
Et si on veut utiliser le point dans nos regex, comment faire ?
Si on l'écrit comme ça, il veut dire "n'importe quelle caractère" !
Pour utiliser en dehors d'une classe l'un des symboles, mais en tant que caractère, il faut l'échapper en le faisant précéder d'un antislash.
Exemple : pour savoir si une chaîne se termine par ".com", on utilisera
/\.com/
Voici une liste de symboles à échapper :
| . ^ $ ( ) [ ] - { } ? * + \ /
À l'intérieur d'une classe, inutile d'échapper les caractères autres que
^ [ ] - \.
De même que pour les classes prédéfinies, si vous utilisez la notation
new RegExp("motif"), il faut penser à échapper les antislashes, ainsi que les guillemets !
Voici à nouveau deux regex identiques :
Code : JavaScript1
2 | var regex1 = /\.com/;
var regex2 = new RegExp("/\\.com/");
|
Parenthèses : avec ou sans capture ?
Ce qu'on n'a pas encore dit...
Pour l'instant, nous utilisons simplement les regex pour savoir si une chaîne vérifiait un certain motif. Mais les regex permettent bien plus que ça !
Il est également possible de savoir quelles sous-chaînes satisfont le motif, et on va même pouvoir utiliser les regex pour en
extraire certains morceaux.
Ainsi, dans une phrase telle que
"les horaires sont 16h45, 17h, 17h20 et 17h40", il est possible d'extraire toutes les heures à l'aide d'une simple regex.
Puissant !
Les parenthèses capturantes
Pour extraire certains morceaux d'une chaîne de caractères, il faut les délimiter dans notre motif. Pour ce faire, on utilise les parenthèses, qui sont dites
capturantes.
Un exemple : on veut extraire l'âge du visiteur, qui se trouve dans une chaîne du type "
J'ai 99 ans".
Construisons notre motif lentement... on va d'abord se baser sur "
j'ai" et "
ans", sans tenir compte de la casse :
/j\'ai - ans/i
Ces mots sont séparés de l'âge par un blanc (éventuellement, l'utilisateur peut écrire "
99ans" sans espace) :
/j\'ai\s - \s?ans/i
Maintenant, on ajoute les chiffres (1, 2 ou 3 chiffres), en les capturant grâce aux parenthèses :
/j\'ai\s(\d{1,3})\s?ans/i
On a donc notre regex
/j\'ai\s(\d{1,3})\s?ans/i 
Elle va nous permettre d'extraire l'âge (dans notre exemple, 99).
Pour l'instant, on ne sait pas comment récupérer le contenu ; en fait, ça va dépendre de la fonction utilisée, on en reparlera donc quand on présentera les fonctions.
Et si on veut des parenthèses qui ne capturent pas ?
Cependant, on peut avoir besoin de parenthèses, mais sans pour autant vouloir en capturer le contenu (par exemple, avec le symbole
| vu plus haut).
Il est possible de les rendre non-capturantes, en les faisant commencer par
?:.
Reprenons un exemple vu plus haut, en rendant les parenthèses non capturantes :
/(?:st|h|p)op/
Les assertions
Terminons la théorie par un point un peu plus délicat.
Supposons que nous voulions rechercher "
bon", mais uniquement dans le mot "
bonjour"...
On pourrait utiliser des parenthèses capturantes, de cette manière :
/(bon)jour/.
Ainsi, "Bien le
bonjour, mon bon monsieur" vérifiera ce motif.
On récupère donc deux choses : le "bonjour", qui satisfait le motif, et le "bon", capturé par les parenthèses.
Mais il est possible d'utiliser ce qu'on appelle une assertion : le symbole
(?= (à placer entre parenthèses) à la fin du motif, signifie "
si le motif est suivi de".
Dans l'exemple précédent, ceci nous donne
/bon(?=jour)/. Comprenez-le ainsi : "
bon, s'il est suivi de
jour".
Ainsi, dans la phrase "Bien le
bonjour, mon bon monsieur", seul le "
bon", s'il est suivi de "
jour", est sélectionné.
Il existe de même le symbole
?!, en fin de motif lui aussi, signifiant "
si le motif n'est pas suivi de".
Ainsi,
/bon(?!jour)/ (comprenez : "
bon, s'il n'est pas suivi de
jour") appliqué à la même phrase nous donnera ce résultat : "Bien le bonjour, mon
bon monsieur".
Remarquez qu'on retrouve le symbole = pour "est suivi de", et ! pour "n'est pas suivi de".
Comme pour les signes == et !=, le = exprime l'égalité, et le ! la négation.