Регулярное выражение для обнаружения одной из нескольких строк
У меня есть список адресов электронной почты, принадлежащих нескольким доменам. Я хотел бы, чтобы регулярное выражение соответствовало адресам, принадлежащим трем конкретным доменам (для этого примера: foo, bar и baz)
Таким образом, они будут соответствовать:
Это не будет:
В идеале они не совпадают (хотя это не критично для этой конкретной проблемы):
Абстрагирование проблемы немного: я хочу совместить строку, содержащую хотя бы один из заданного списка подстрок.
Ответы
Ответ 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 переполнен. Конечно, мое предположение состоит в том, что ваше дело действительно так просто, как вы указали.