我怎样才能否定这个正则表达式?

我在这个网站上找到了关于正则表达式的单词集合。 我尝试了5号,并设法匹配我所需要的相反部分。

这些不应该匹配:

abba
anallagmatic
bassarisk
...

这些应该匹配:

acritan
aesthophysiology
amphimictical
...

这种模式匹配逆向:

([a-z])([a-z])21

不幸的是,我不知道如何否定它。 我读到这个:

(?!([a-z])([a-z])21)

但似乎简单的嵌套不起作用。 使用正则表达式支持组嵌套吗?

它可以做什么?


回答你的问题

你必须对它有点想象:

^((?!([a-z])([a-z])32).)+$

Debuggex演示

一些提示

由于这是来自http://regex.alf.nu/的正则表达式高尔夫谜题5 ,我会给你一些提示。

首先,对不熟悉这些难题的读者作一些澄清:这是一个基于xkcd漫画1313的难题。 它被称为“正则表达式高尔夫”。 给出两个列表,并且必须弄清楚如何匹配其中一个元素中的所有元素,但是使用最短的正则表达式可以找到其中的元素。 在所讨论的网站上,大多数谜题在其中一个列表中有一个模式,目标是找出适用的规则,并使用该规则编写短正则表达式,或者,如果更短,则使用正则表达式忽略规则,但恰好工作。 在这种情况下,你想匹配在他们的字母中没有abba (或itti ,或其他)模式的单词。

提示1:这个更短,因为它用S代替[az]

^((?!(S)(S)32).)+$

Debuggex演示

提示2:虽然两个正则表达式都起作用,但这两个正则表达式都不是最困难的正则表达式。 最短的工作正则表达式是一种“作弊”,因为它并不与字面匹配,但仍能正确区分列表。


这里已经回答了这个问题:

如何否定整个正则表达式?

或者另一个想法是,你可以在代码中做到这一点。 例如,在C#中

strin gtext = "abba";
Regex r = new Regex("([a-z])([a-z])21");
if(!r.IsMatch(text))
//Then do something

用! 你说的相同,如果不匹配

链接地址: http://www.djcxy.com/p/77001.html

上一篇: How can I negate this regex?

下一篇: How to negate the whole regex?