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â¦)