代码之家  ›  专栏  ›  技术社区  ›  Ray

用于匹配字符串“除此之外的所有内容”的正则表达式

  •  1
  • Ray  · 技术社区  · 17 年前

    我正在寻找一个正则表达式,该表达式将匹配所有字符串,但其中包含特定字符串的字符串除外。有人能帮我建造它吗?

    例如,查找所有

    所以
    abasfaf3将匹配,而
    asasdfbasc不会

    4 回复  |  直到 17 年前
        1
  •  4
  •   Federico A. Ramponi    17 年前

    >>> r = re.compile("(?!^.*a.*b.*c.*$)")
    >>> r.match("abc")
    >>> r.match("xxabcxx")
    >>> r.match("ab ")
    <_sre.SRE_Match object at 0xb7bee288>
    >>> r.match("abasfaf3")
    <_sre.SRE_Match object at 0xb7bee288>
    >>> r.match("asasdfbasc")
    >>>
    
        2
  •  2
  •   Alan    17 年前

    在perl中:

    if($str !~ /a.*?b.*?.*c/g)
    {
        print "match";
    }
    

    应该有用。

        3
  •  1
  •   Johannes Schaub - litb    17 年前

    你可以从理论上建立一个正则表达式来匹配相反的结果。但对于更长的字符串,正则表达式将变得更大。系统地完成这项工作的方法是(大大简化):

    • 转换自动机的结束条件,以便它接受倒置的正则语言
    • 通过连续删除自动机中的节点,同时保持其行为不变,将自动机转换回正则表达式。删除一个节点将需要将两个或多个正则表达式放在一起,以便它们能够解释删除的节点。
    • 如果恰好有一个开始节点和一个结束节点,那么就完成了:标记它们之间的边的正则表达式就是搜索到的正则表达式。

    echo azyxbc | awk '{ exit ($0 !~ /a.*b.*c/); }' && echo matched
    

    如果你对此感兴趣,我推荐这本书“ 计算理论导论

        4
  •  0
  •   VonC    17 年前

    在Java中:

    (?m)^a?(.(?!a[^b\r\n]*b[^\r\nc]*c))+$
    

    abasfaf3
    xxxabasfaf3
    

    不匹配

    asasdfbascf
    xxxxasasdfbascf