Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 我怎样才能否定这个正则表达式?_Regex - Fatal编程技术网

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

Regex 我怎样才能否定这个正则表达式?,regex,Regex,我在桌子上发现了一组单词。我试了5号,设法找到了我需要的相反的号码 这些不应匹配: abba anallagmatic bassarisk ... acritan aesthophysiology amphimictical ... 应匹配以下各项: abba anallagmatic bassarisk ... acritan aesthophysiology amphimictical ... 此模式与之相反: ([a-z])([a-z])\2\1 不幸的是,我不知道如何否定它。我

我在桌子上发现了一组单词。我试了5号,设法找到了我需要的相反的号码

这些不应匹配:

abba
anallagmatic
bassarisk
...
acritan
aesthophysiology
amphimictical
...
应匹配以下各项:

abba
anallagmatic
bassarisk
...
acritan
aesthophysiology
amphimictical
...
此模式与之相反:

([a-z])([a-z])\2\1
不幸的是,我不知道如何否定它。我读到:

(?!([a-z])([a-z])\2\1)
但简单的嵌套似乎不起作用。使用正则表达式时是否支持组嵌套


它能做什么?

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

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

用!您所说的是相同的,如果不匹配,则回答您的问题 你必须对它有点幻想:

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

一些提示 由于这是来自,我将给你一些提示

首先,给不熟悉的读者一些澄清:这是一个谜题,基于。它被称为“regex golf”。你会得到两个列表,你必须找出如何使用你能找到的最短的regex匹配其中一个列表中的所有元素,而另一个列表中没有。在所讨论的网站上,大多数谜题在其中一个列表中都有一个模式,目标是找出适用的规则,或者编写一个应用该规则的短正则表达式,或者,如果它较短,则编写一个忽略该规则但恰好起作用的正则表达式。在本例中,您希望匹配字母中没有
abba
(或
itti
,或其他)模式的单词

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

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


提示2:尽管上述两个正则表达式都有效,但它们都不是拼图中最短的有效正则表达式。最短的工作正则表达式是一个“欺骗”,因为它与模式不完全匹配,但却能正确区分列表。

不要让读者参考链接页面。写下你正在处理的模式。我写了,不是吗?参考资料只是为了完整。不,你没有。您只是给出了列表,但没有解释它们匹配与否的原因。@sawa这就是问题所在。您将获得两个列表,并且必须使用您能找到的最短正则表达式,找出如何匹配其中一个而不是另一个。它被称为“regex golf”。在这种情况下,很明显,您希望匹配字母中没有
abba
(或
itti
,或其他)模式的单词。@EdCottrell这不明显。但是谢谢你的澄清,这很酷。我不明白为什么我们需要
?:
。我认为它禁用了对该组的反向引用。对不对?我将其解释为:“至少匹配一次前面有模式(如abba)的任何字符(
)。如果是真的,该单词将被跳过,因为
?!
”难道
^
不要求模式位于开头吗?而且,
$
不要求模式在末尾吗?这是不是因为
?:
?你说得对;我们不需要
?:
。很抱歉有一刻我忘了我在打regex高尔夫!:)但是,如果取出
?:
,则必须将背面参照从
\2\1
更改为
\3\2
,因为最外面的
(…)
组变为
\1
。请参阅上面我编辑的版本。我认为这是最有效的方法。。。试图“否定”正则表达式很麻烦(但并非不可能,Ed Cottrell的回答试图表明),因为匹配的语义是“我找到了一个与我的RE完全匹配的匹配”-找到一个与你的“否定RE”匹配的匹配并不一定证明与你的“肯定RE”不匹配这是一个聪明的解决方案!对于测验,这是不适用的,但在现实世界中,这可能是一个优雅的解决方案。