正则表达式检测几个字符串之一

时间:2009-03-10 20:57:38

标签: regex

我有一个属于多个域的电子邮件地址列表。我想要一个匹配属于三个特定域的地址的正则表达式(例如:foo,bar和& baz)

所以这些匹配:

  1. 一个@ FOO
  2. 一个@杆
  3. b @巴兹
  4. 这不会:

    1. 一个@ fnord
    2. 理想情况下,这些也不匹配(尽管这对于这个特定问题并不重要):

      1. 一个@ foobar的
      2. b @ foofoo
      3. 稍微提出问题:我想匹配一个包含至少一个给定子串列表的字符串。

7 个答案:

答案 0 :(得分:100)

使用竖管符号表示“或”:

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

如果您不想要捕获组,请使用非捕获分组符号:

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

(当然我假设“a”对于电子邮件地址的前面是可以的!你应该用合适的正则表达式替换它。)

答案 1 :(得分:10)

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

如果你有一个强烈定义的列表。开始和结束字符仅搜索这三个字符串。

答案 2 :(得分:4)

使用:

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

请注意与其他答案的区别:

  • \.? - 匹配0或1个点,以防电子邮件地址中的域名为“完全合格”
  • $ - 表示字符串必须以此顺序结束,
  • /i - 使测试用例不敏感。

请注意,这假设每个电子邮件地址都在一条线上。

如果匹配的字符串可以在字符串中的任何位置,则删除$,并将其替换为\s+(与一个或多个空白字符匹配)

答案 3 :(得分:2)

应该更通用,a不应该算,虽然@ should。

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

Here是关于正则表达式的一个很好的参考。

编辑:更改结尾以允许结束模式或分词。现在假设foo / bar / baz是完整的域名。

答案 4 :(得分:1)

如果前一个(和逻辑)答案有关'|'不适合你,看看

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

模块描述:从单词列表中创建正则表达式

答案 5 :(得分:0)

您不需要正则表达式来查找字符串是否包含给定的子字符串列表中的至少一个。在Python中:

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

对于大string_和许多子串,上述情况很慢。 GNU fgrep可以同时有效地搜索多个模式。

使用正则表达式

import re

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

相关

答案 6 :(得分:0)

好的,我知道你要求一个正则表达式的答案。 但是你考虑过用'@'字符分割字符串 取第二个数组值(域) 并做一个简单的匹配测试

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

我觉得RegEx太过分了。当然,我的假设是你的案子真的很简单。