为什么这两个表达不相等?

时间:2015-08-01 18:35:26

标签: regex regex-negation

我想捕捉彼此不相同的字母。这个找到一个字母然后检查它旁边的另一个字母是否不相同。这个有效。

\b((\w)(?!(\2)))+\b

这个说不匹配彼此相邻的字母,至少这是我认为它应该做的,但它不起作用。

\b(?!((\w)\3))+\b

1 个答案:

答案 0 :(得分:0)

第二种模式\b(?!((\w)\3))+\b非常奇怪

  • 没有\3,因为否定前瞻(?!...)不会形成捕获组,因此您只有两个组

  • 如果整体模式匹配,那么您知道负面预测匹配,因此永远不会定义\1\2

  • 您要求零宽度模式的多个副本(负前瞻与字符串中的单点匹配)

  • 负面预测永远不会消耗任何字符,因此两个字边界之间永远不会有任何字符

很难知道如何为你“修复”这个问题,因为我看不到你想要实现的算法。你的第一个模式不需要围绕\2的括号:只有(?!\2)是正常的,并且你没有捕获匹配后使用的整个单词,这通常是比使用更好的方法整个匹配的字符串

我想我会写这个

\b((?:(\w)(?!\2))+)\b