我如何否定这个正则表达式?

时间:2014-03-12 14:58:47

标签: regex

我在this website about regular expressions找到了一系列字词。我尝试了第5号并设法与我需要的相反。

这些不应该匹配:

abba
anallagmatic
bassarisk
...

这些应该匹配:

acritan
aesthophysiology
amphimictical
...

此模式与反向匹配:

([a-z])([a-z])\2\1

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

(?!([a-z])([a-z])\2\1)

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

它能做什么?

2 个答案:

答案 0 :(得分:5)

回答您的问题

你必须对它有点喜欢:

^((?!([a-z])([a-z])\3\2).)+$

Regular expression visualization

Debuggex Demo

一些提示

由于这是来自regex golf puzzle 5 at http://regex.alf.nu/,我会给你一些提示。

首先,对不熟悉these puzzles的读者做一些澄清:这是一个基于xkcd comic 1313的谜题。它被称为“正则表达式高尔夫”。您将获得两个列表,并且必须使用您可以找到的最短正则表达式来确定如何匹配一个中的所有元素而不使用另一个中的所有元素。在有问题的网站上,大多数谜题在其中一个列表中都有一个模式,目标是找出适用的规则,或者写一个应用该规则的短正则表达式,或者,如果它更短,则忽略一个正则表达式规则,但恰好工作。在这种情况下,您希望匹配在其字母中具有abba(或itti或其他)模式的字词。

提示1:这是更短的,因为它将[a-z]替换为\S

^((?!(\S)(\S)\3\2).)+$

Regular expression visualization

Debuggex Demo

提示2:虽然两个正则表达式都在工作,但无论如何都不是拼图的最短工作正则表达式。最短的工作正则表达式是一种“作弊”,因为它与模式不完全匹配,但仍然可以在列表之间正确区分。

答案 1 :(得分:3)

这已在这里得到解答:

How to negate the whole regex?

或者另一个想法是你可以在代码中完成它。例如,在C#..

strin gtext = "abba";
Regex r = new Regex("([a-z])([a-z])\2\1");
if(!r.IsMatch(text))
//Then do something
随着!你是说同样的,如果不匹配