我正在玩正则表达式高尔夫(http://regex.alf.nu/),并且正在进行Abba游戏。我有以下匹配错误方面的正则表达式(这正是我想要做的):
(([\w])([\w])\3\2)
然而,我现在正试图否定它以使其与另一侧匹配。但是我似乎无法理解那部分。我尝试了:
(?!([\w])([\w])\3\2)
但那行不通。有正则表达式大师的任何提示吗?
我正在玩正则表达式高尔夫(http://regex.alf.nu/),并且正在进行Abba游戏。我有以下匹配错误方面的正则表达式(这正是我想要做的):
(([\w])([\w])\3\2)
然而,我现在正试图否定它以使其与另一侧匹配。但是我似乎无法理解那部分。我尝试了:
(?!([\w])([\w])\3\2)
但那行不通。有正则表达式大师的任何提示吗?
只需使用 .
并删除不必要的括号,即可将其缩短(并获得更多分数)。
^(?!.*(.)(.)\2\1)
它只是确保字符串的任何部分中没有“abba”(“abba”在这里指特定顺序的4个字母,我们不想匹配整个单词)而无需匹配整个单词。
?!
是如何工作的吗?更具体地说,为什么 (?!(.)(.)\2\1)
匹配所有内容。 - Adi Bradfield(?!a)a
永远不会匹配任何内容,因为在 (?! ... )
组之后有一个 a
,而 (?!a)
防止匹配如果在其后面有 a
(内部的内容)。同样,(?!a)b
将始终匹配 b
,因为虽然 (?!a)
防止匹配如果其后跟着 a
,但这永远不会发生,因为在其后面有一个 b
。扩展到 ^(?!.*a)
,如果任何行包含 a
,则将防止匹配。锚点和 .*
很重要,否则模式将开始匹配可能存在的任何 a
(因为在那一点之后,没有更多的 a
来防止匹配)。 - Jerry