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

Cra*_*ker 46 regex

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

所以这些匹配:

  1. 一个@ FOO
  2. 一间酒吧
  3. b @巴兹

这不会:

  1. 一个@ fnord

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

  1. 一个@ foobar的
  2. b @ foofoo

稍微抽象一下这个问题:我想匹配一个包含至少一个给定子串列表的字符串.

Jas*_*hen 112

使用管道符号表示"或":

/a@(foo|bar|baz)\b/
Run Code Online (Sandbox Code Playgroud)

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

/a@(?:foo|bar|baz)\b/
Run Code Online (Sandbox Code Playgroud)

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

  • 嗯,我不认为我错过了什么.我的正则表达式匹配第一个列表但不匹配接下来的两个列表,并指示如何在正则表达式中执行"或",这将回答最后一部分. (4认同)
  • 你刚刚让我免于再失去 12-16 根头发。我头皮发麻,谢谢您,先生! (2认同)

Gre*_*mer 12

^(a|b)@(foo|bar|baz)$
Run Code Online (Sandbox Code Playgroud)

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


Aln*_*tak 5

使用:

/@(foo|bar|baz)\.?$/i
Run Code Online (Sandbox Code Playgroud)

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

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

注意,这假定每个电子邮件地址都单独位于一行上。

如果要匹配的字符串可能在字符串中的任何位置,请放下$,并将其替换为\s+(匹配一个或多个空格字符)