首页 文章

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

提问于
浏览
42

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

所以这些匹配:

  • 一个@ foo

  • 一个@吧

  • b @ baz

这不会:

  • a @ fnord

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

  • a @ foobar

  • b @ foofoo

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

7 回答

  • 1

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

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

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

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

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

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

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

  • 10

    使用:

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

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

    • \.? - 匹配0或1个点,以防电子邮件地址中的域名为"fully qualified"

    • $ - 表示该字符串必须以此序列结尾,

    • /i - 使测试用例不敏感 .

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

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

  • 0

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

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

    Here是正则表达式的一个很好的参考 .

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

  • 98

    如果先前(和逻辑)答案关于'|'不适合你,看看

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

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

  • 2

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

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

    在我看来,RegEx太过分了 . 当然,我的假设是你的案子真的和你列出的一样简单 .

  • 4

    您不需要正则表达式来查找字符串是否包含给定的子字符串列表中的至少一个 . 在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
    

    相关

相关问题