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)ysignifie la même chose quegr[ae]y.gra|eysignifiegraouey.
Pour appliquer l’alternance à une partie du modèle nous pouvons l’encadrer entre parenthèses:
I love HTML|CSScorrespond àI love HTMLouCSS.I love (HTML|CSS)correspond àI love HTMLouI 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
0ou1, 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
Commentaires
<code>, pour plusieurs lignes – enveloppez-les avec la balise<pre>, pour plus de 10 lignes - utilisez une sandbox (plnkr, jsbin, codepen…)