添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Alternance (OU) |

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 que gr[ae]y .
  • gra|ey signifie gra ou ey .
  • Pour appliquer l’alternance à une partie du modèle nous pouvons l’encadrer entre parenthèses:

  • I love HTML|CSS correspond à I love HTML ou CSS .
  • I love (HTML|CSS) correspond à I love HTML ou I 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 ou 1 , 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:

    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 :

    La solution : /"(\\.|[^"\\])*"/g .

    Etape par etape :

  • D’abord nous recherchons une guillemet ouvrante "
  • Ensuite si nous avons un antislash \\ (puisque c’est un caractère spécial nous devons le doubler, mais dans les faits c’est un unique antislash), alors n’importe quel caractère peut se trouver à sa suite (un point).
  • Sinon nous prenons n’importe quel caractère à part une guillemet (cela signifierait la fin de la chaine de caractère) et un antislash (pour empêcher les antislash solitaires, un antislash est seulement utilisé avec un autre symbole après lui): [^"\\]
  • …Et on continue jusqu’à atteindre la guillemet fermante.
  • En action :

    let regexp = /"(\\.|[^"\\])*"/g;
    let str = ' .. "test me" .. "Say \\"Hello\\"!" .. "\\\\ \\"" .. ';
    alert( str.match(regexp) ); // "test me","Say \"Hello\"!","\\ \""