Подтвердить что ты не робот

Регулярное выражение для обнаружения одной из нескольких строк

У меня есть список адресов электронной почты, принадлежащих нескольким доменам. Я хотел бы, чтобы регулярное выражение соответствовало адресам, принадлежащим трем конкретным доменам (для этого примера: foo, bar и baz)

Таким образом, они будут соответствовать:

  • а @Foo
  • а @бар
  • б @БАЗ

Это не будет:

  • а @Fnord

В идеале они не совпадают (хотя это не критично для этой конкретной проблемы):

  • а @Foobar
  • б @foofoo

Абстрагирование проблемы немного: я хочу совместить строку, содержащую хотя бы один из заданного списка подстрок.

4b9b3361

Ответ 1

Используйте символ трубы, чтобы указать "или":

/[email protected](foo|bar|baz)\b/

Если вы не хотите группу захвата, используйте символ не захвата группировки:

/[email protected](?:foo|bar|baz)\b/

(Конечно, я предполагаю, что "a" в порядке для адреса электронной почты! Вы должны заменить его подходящим регулярным выражением.)

Ответ 2

^(a|b)@(foo|bar|baz)$

если у вас есть этот сильно определенный список. Начальный и конечный символы будут искать только три строки.

Ответ 3

Использование:

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

Обратите внимание на отличия от других ответов:

  • \.? - сопоставление 0 или 1 точки, если домены на электронном адресе "полностью соответствуют"
  • $ - указать, что строка должна заканчиваться этой последовательностью,
  • /i - чтобы сделать тестовый регистр нечувствительным.

Примечание. Предполагается, что каждый адрес электронной почты находится в отдельной строке.

Если совпадающая строка может быть в любом месте строки, затем отпустите $ и замените ее на \s+ (которая соответствует одному или нескольким символам пробела)

Ответ 4

должен быть более общим, a не должен считаться, хотя @должен.

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

Здесь является хорошей ссылкой на регулярное выражение.

edit: изменить окончание, чтобы разрешить конец шаблона или сломать слово. теперь предполагается, что foo/bar/baz - это полные имена доменов.

Ответ 5

Если предыдущие (и логические) ответы о '|' вам не подходит, посмотрите

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

описание модуля: создание регулярных выражений из списков слов

Ответ 6

Вам не нужно регулярное выражение, чтобы определить, содержит ли строка хотя бы один из заданного списка подстрок. В Python:

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

Вышеуказанное медленное для больших string_ и многих подстрок. GNU fgrep может эффективно искать несколько шаблонов одновременно.

Использование regex

import re

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

Связанные

Ответ 7

Хорошо, я знаю, что вы спросили о регулярном выражении. Но рассмотрели ли вы просто разделение строки на "@" char взяв второе значение массива (домен) и выполнение простого теста соответствия

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

Мне кажется, что RegEx переполнен. Конечно, мое предположение состоит в том, что ваше дело действительно так просто, как вы указали.