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

Regex 用于匹配字符串“除此之外的所有内容”的正则表达式,regex,Regex,我正在寻找一个正则表达式,该表达式将匹配所有字符串,但其中包含特定字符串的字符串除外。有人能帮我建造它吗 例如,按顺序查找没有a、b和c的所有字符串 所以 abasfaf3将匹配,而 asasdfbasc在perl中不会: if($str !~ /a.*?b.*?.*c/g) { print "match"; } 应该可以工作。在perl中: if($str !~ /a.*?b.*?.*c/g) { print "match"; } 应该可以工作。在Java中: (?m)^a

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

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

所以 abasfaf3将匹配,而 asasdfbasc在perl中不会

if($str !~ /a.*?b.*?.*c/g)
{
    print "match";
}
应该可以工作。

在perl中:

if($str !~ /a.*?b.*?.*c/g)
{
    print "match";
}
应该可以工作。

在Java中:

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

abasfaf3
xxxabasfaf3
不匹配

asasdfbascf
xxxxasasdfbascf
在Java中:

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

abasfaf3
xxxabasfaf3
不匹配

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

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

将正则表达式转换为确定性有限自动机 转换自动机的结束条件,以便它接受倒置的正则语言 通过连续删除自动机中的节点,同时保持其行为不变,将自动机转换回正则表达式。删除一个节点将需要将两个或多个正则表达式放在一起,以便它们能够解释删除的节点。 如果恰好有一个开始节点和一个结束节点,那么就完成了:标记它们之间的边的正则表达式就是搜索到的正则表达式。 实际上,您可以只匹配不希望包含在其中的字符串,然后反转结果。以下是awk中的外观:

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

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

好吧,你可以从理论上构建一个与之相反的正则表达式。但对于更长的字符串,正则表达式将变得更大。系统地完成这项工作的方法大大简化:

将正则表达式转换为确定性有限自动机 转换自动机的结束条件,以便它接受倒置的正则语言 通过连续删除自动机中的节点,同时保持其行为不变,将自动机转换回正则表达式。删除一个节点将需要将两个或多个正则表达式放在一起,以便它们能够解释删除的节点。 如果恰好有一个开始节点和一个结束节点,那么就完成了:标记它们之间的边的正则表达式就是搜索到的正则表达式。 实际上,您可以只匹配不希望包含在其中的字符串,然后反转结果。以下是awk中的外观:

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

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

我明白了,所以要积极寻找匹配我试图避免的字符串,然后采取相反的方法。我想不出为什么那不起作用……好吧,你可以构建一个与之相反的正则表达式。但这个正则表达式将是巨大的。这样做的方法是构建一个FSM,反转结束条件,然后从中构建一个正则表达式it@Ray:是的,你明白了。在这种情况下,更容易将不需要的正则表达式正则化,然后找到与正则表达式不匹配的字符串。s代表替换,在这种情况下是不正确的。g代表全局匹配,我看到了,所以积极寻找匹配我试图避免的字符串,然后采取相反的方法。我想不出为什么那不起作用……好吧,你可以构建一个与之相反的正则表达式。但这个正则表达式将是巨大的。这样做的方法是构建一个FSM,反转结束条件,然后从中构建一个正则表达式it@Ray:是的,你明白了。在这种情况下,更容易将不需要的正则表达式正则化,然后找到与正则表达式不匹配的字符串。s代表替换,在这种情况下是不正确的。g代表全局匹配,寻找一个可以适应任何引擎的通用正则表达式。我真的在寻找一个理论上的答案。任何,寻找一个通用的正则表达式,可以适用于任何引擎。我真的在寻找一个理论上的答案。我没有投你反对票。但我今天也问了同样的问题。为什么他们否决了我的漂亮拼图?我没有否决你。但我今天也问了同样的问题。为什么他们否决了我的纯拼图??