我有一个包含多个域名邮箱地址的列表。我需要一个正则表达式匹配属于三个特定域名的地址(在这个例子中为:foo,bar和baz)。
因此,以下地址将匹配:
- a@foo
- a@bar
- b@baz
以下地址不会匹配:
- a@fnord
理想情况下,以下地址也不会匹配(尽管这对于特定问题并不是至关重要):
- a@foobar
- b@foofoo
将问题抽象化一些:我想匹配包含给定子字符串列表中至少一个子串的字符串。
我有一个包含多个域名邮箱地址的列表。我需要一个正则表达式匹配属于三个特定域名的地址(在这个例子中为:foo,bar和baz)。
因此,以下地址将匹配:
以下地址不会匹配:
理想情况下,以下地址也不会匹配(尽管这对于特定问题并不是至关重要):
将问题抽象化一些:我想匹配包含给定子字符串列表中至少一个子串的字符串。
使用管道符号 "|" 来表示 "或":
/a@(foo|bar|baz)\b/
如果你不想捕获分组,可以使用非捕获分组符号:
/a@(?:foo|bar|baz)\b/
当然,我假设在电子邮件地址前面使用“a
”是可以的!您应该将其替换为适合的正则表达式。
^(a|b)@(foo|bar|baz)$
如果您已经强制定义了一个列表,则开始和结束字符将仅搜索那三个字符串。
使用:
/@(foo|bar|baz)\.?$/i
\.?
- 匹配0或1个点,以防电子邮件地址中的域名是“完全限定”的$
- 表示字符串必须以此序列结束,/i
- 使测试不区分大小写。$
,并将其替换为\s+
(它匹配一个或多个空格字符)。/@(foo|bar|baz)(?:\W|$)/
这里是有关正则表达式的良好参考资料。
编辑:更改结尾以允许模式结束或单词断点。现在假设foo/bar/baz是完整的域名。
你不需要使用正则表达式来查找一个字符串是否包含给定列表中的至少一个子字符串。在Python中:
def contain(string_, substrings):
return any(s in string_ for s in substrings)
import re
def contain(string_, substrings):
regex = '|'.join("(?:%s)" % re.escape(s) for s in substrings)
return re.search(regex, string_) is not None
好的,我知道你要求一个正则表达式的答案。 但是你考虑过用'@'字符分割字符串, 取第二个数组值(域名) 并进行简单的匹配测试吗?
if (splitString[1] == "foo" && splitString[1] == "bar" && splitString[1] == "baz")
{
//Do Something!
}
在我看来,正则表达式有点过头了。当然,我的假设是你的情况确实像你所列举的那样简单。