Alternance est le terme d’expression régulière qui représente un “OU”.
Dans une expression régulière l’alternance est représentée par une barre verticale |
.
Par exemple, nous souhaitons trouver les langages de programmation suivants: HTML, PHP, Java ou JavaScript.
La regexp correspondante : html|php|java(script)?
.
Exemple d’utilisation:
let regexp = /html|php|css|java(script)?/gi;
let str = "First HTML appeared, then CSS, then JavaScript";
alert( str.match(regexp) ); // 'HTML', 'CSS', 'JavaScript'
Nous avons déjà vu une chose similaire, les crochets. Ils permettent de choisir entre plusieurs caractères, par exemple gr[ae]y
correspond à gray
ou grey
.
Les crochets n’autorisent que les caractères ou les classes de caractère. L’alternance permet n’importe quelle expression. Une regexp A|B|C
signifie A
, B
ou C
.
Par exemple:
gr(a|e)y
signifie la même chose quegr[ae]y
.gra|ey
signifiegra
ouey
.
Pour appliquer l’alternance à une partie du modèle nous pouvons l’encadrer entre parenthèses:
I love HTML|CSS
correspond àI love HTML
ouCSS
.I love (HTML|CSS)
correspond àI love HTML
ouI love CSS
.
Exemple: regexp d’un temps
Dans les articles précédents il y avait une tâche qui consistait à construire une regexp pour trouver un temps de la forme hh:mm
, par exemple 12:00
. Mais un simple modèle \d\d:\d\d
est trop vague. Il accepte 25:99
comme temps (puisque “99 minutes” correspond au modèle, mais ce temps est invalide).
Comment pouvons-nous créer un meilleur modèle ?
Nous pouvons utiliser une correspondance plus appropriée. Premièrement, les heures :
- Si le premier chiffre est
0
ou1
, alors le prochain chiffre peut être:[01]\d
. - Sinon, si le premier chiffre est
2
, alors le prochain doit être[0-3]
. - (aucun autre premier chiffre est autorisé)
Nous pouvons écrire les deux variantes dans une regexp en utilisant l’alternance: [01]\d|2[0-3]
.
Ensuite, les minutes doivent être entre 00
et 59
. Dans le langage des expression régulières cela peut être écrit [0-5]\d
: le premier chiffre 0-5
, puis n’importe quel chiffre.
Si nous rejoignons les heures et les minutes ensemble, nous obtenons le modèle: [01]\d|2[0-3]:[0-5]\d
.
Nous y sommes presque, mais il y a un problème. L’alternance |
se trouve désormais entre [01]\d
et 2[0-3]:[0-5]\d
.
Cela signifie que les minutes sont incluses dans la seconde variante d’alternance, voici un affichage plus clair:
[01]\d | 2[0-3]:[0-5]\d
Ce modèle recherche [01]\d
ou 2[0-3]:[0-5]\d
.
Mais c’est incorrect, l’alternance ne devrait être utilisé que pour la partie “heures” de l’expression régulière, pour permettre [01]\d
OU 2[0-3]
. Corrigeons cela en mettant les “heures” entre parenthèses : ([01]\d|2[0-3]):[0-5]\d
.
La solution finale :
let regexp = /([01]\d|2[0-3]):[0-5]\d/g;
alert("00:00 10:10 23:59 25:99 1:2".match(regexp)); // 00:00,10:10,23:59