正则表达式匹配“除了”一个字符串

时间:2008-11-26 22:34:45

标签: regex

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

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

所以
abasfaf3会匹配,而
asasdfbasc不会

4 个答案:

答案 0 :(得分:4)

在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")
>>>

答案 1 :(得分:2)

in perl:

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

应该有用。

答案 2 :(得分:1)

嗯,你可以理论上建立一个与之相反的正则表达式。但对于更长的字符串,正则表达式会变大。系统地这样做的方式是(大大简化):

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

实际上,您可以匹配所包含的字符串,并反转结果。这是awk中的样子:

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

如果您对此感兴趣,我推荐Michael Sipser撰写的“计算理论导论”一书。

答案 3 :(得分:0)

Java中的

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

匹配

abasfaf3
xxxabasfaf3

不符合

asasdfbascf
xxxxasasdfbascf