103 votes

Regex pour détecter l'une des plusieurs chaînes

J'ai une liste d'adresses e-mail appartenant à plusieurs domaines. J'aimerais une regex qui correspondrait aux adresses appartenant à trois domaines spécifiques (pour cet exemple : foo, bar et baz)

Donc, ces adresses correspondraient :

  1. a@foo
  2. a@bar
  3. b@baz

Cela ne correspondrait pas :

  1. a@fnord

Idéalement, ceux-ci ne correspondraient pas non plus (bien que ce ne soit pas critique pour ce problème particulier) :

  1. a@foobar
  2. b@foofoo

En résumé le problème un peu : je veux correspondre à une chaîne qui contient au moins l'une des sous-chaînes d'une liste donnée.

202voto

Jason Cohen Points 36475

Utilisez le symbole pipe pour indiquer "ou" :

/a@(foo|bar|baz)\b/

Si vous ne voulez pas le groupe de capture, utilisez le symbole de regroupement non capturant :

/a@(?:foo|bar|baz)\b/

(Bien sûr, je suppose que "a" est correct pour le début de l'adresse e-mail ! Vous devriez le remplacer par une regex appropriée.)

21voto

Gregory A Beamer Points 10975
^(a|b)@(foo|bar|baz)$

si vous avez cette liste fortement définie. Le caractère de début et de fin ne recherchera que ces trois chaînes.

7voto

Alnitak Points 143355

Utilisation :

/@(foo|bar|baz)\.?$/i

Remarquez les différences par rapport aux autres réponses :

  • \.? - correspondance de 0 ou 1 point, au cas où les domaines dans l'adresse e-mail sont "entièrement qualifiés"
  • $ - pour indiquer que la chaîne doit se terminer par cette séquence
  • /i - pour rendre le test insensible à la casse.

Remarque, cela suppose que chaque adresse e-mail est sur sa propre ligne.

Si la chaîne à vérifier peut être n'importe où dans la chaîne, alors supprimez le $ et remplacez-le par \s+ (qui correspond à un ou plusieurs caractères d'espace blanc)

2voto

sfossen Points 3671

Devrait être plus générique, le a ne devrait pas compter, bien que le @ devrait.

/@(foo|bar|baz)(?:\W|$)/

Ici est une bonne référence sur les regex.

edit : changer la fin pour permettre la fin du motif ou une rupture de mot. maintenant en supposant que foo/bar/baz sont des noms de domaine complets.

1voto

siukurnin Points 1986

Si les réponses précédentes (et logiques) concernant '|' ne vous conviennent pas, jetez un œil à

http://metacpan.org/pod/Regex::PreSuf

description du module : créer des expressions régulières à partir de listes de mots

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X