【问题标题】:Regex for matching "everything but" a string用于匹配“除了”字符串的正则表达式
【发布时间】:2008-11-26 22:34:44
【问题描述】:

我正在寻找一个正则表达式,它将匹配所有字符串,除了那些包含特定字符串的字符串。有人可以帮我构建它吗?

例如,查找所有没有的字符串按顺序包含a、b和c。

所以
abasfaf3 会匹配,而
asasdfbasc 不会

【问题讨论】:

  • Any,寻找可以适配任何引擎的通用正则表达式。我真的在寻找一个理论上的答案。

标签: regex


【解决方案1】:

在 Python 中:

>>> 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】:

在 perl 中:

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

应该可以。

【讨论】:

  • 我明白了,所以积极寻找与我试图避免的字符串匹配的字符串,然后采取相反的方式。我想不出为什么那行不通...
  • 好吧,理论上你可以构建一个匹配相反的正则表达式。但是那个正则表达式会很大。你这样做的方法是构建一个 FSM,反转结束条件,然后从中构建一个正则表达式
  • @Ray:是的,你明白了。在这种情况下,更容易对您不想要的内容进行正则表达式,然后找到与正则表达式不匹配的字符串。
  • s 用于替换,在这种情况下是不正确的。 g 用于全局匹配
【解决方案3】:

好吧,理论上你可以构建一个匹配相反的正则表达式。但是对于更长的字符串,那个正则表达式会变得很大。您系统地执行此操作的方式是(大大简化):

  • 将正则表达式转换为确定性有限自动机
  • 转换自动机的结束条件,使其接受倒置的正则语言
  • 通过连续从自动机中删除节点,将自动机转换回正则表达式,但保持其行为相同。删除一个节点需要将两个或多个正则表达式放在一起,以便它们解释被删除的节点。
  • 如果您碰巧有一个起始节点和一个结束节点,那么您就完成了:标记它们之间边缘的正则表达式就是您搜索的正则表达式。

实际上,您可以只匹配您希望 包含在其中的字符串,然后反转结果。这是 awk 中的样子:

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

如果你对此感兴趣,我推荐 Michael Sipser 的《计算理论导论》一书。

【讨论】:

    【解决方案4】:

    在 Java 中:

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

    匹配

    abasfaf3
    xxxabasfaf3
    

    不匹配

    asasdfbascf
    xxxxasasdfbascf
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多