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.

0voto

J.F. Sebastian Points 102961

Vous n'avez pas besoin d'une expression régulière pour trouver si une chaîne contient au moins l'un des sous-chaînes données. En Python :

def contain(string_, substrings):
    return any(s in string_ for s in substrings)

Le code ci-dessus est lent pour une grande string_ et de nombreuses sous-chaînes. GNU fgrep peut rechercher efficacement plusieurs motifs en même temps.

Utilisation d'une expression régulière

import re

def contain(string_, substrings):
    regex = '|'.join("(?:%s)" % re.escape(s) for s in substrings)
    return re.search(regex, string_) is not None

Connexe

0voto

Andrew Harry Points 5488

D'accord, je sais que vous avez demandé une réponse regex. Mais avez-vous envisagé de simplement diviser la chaîne avec le caractère '@' prendre la deuxième valeur du tableau (le domaine) et faire un test de correspondance simple

if (splitString[1] == "foo" && splitString[1] == "bar" && splitString[1] == "baz")
{
   //Do Something!
}

Il me semble que RegEx est exagéré. Bien sûr, mon hypothèse est que votre cas est vraiment aussi simple que vous l'avez indiqué.

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