Java正则表达式错误 - 使用组引用进行后瞻

时间:2013-05-20 16:21:14

标签: java regex backreference negative-lookahead negative-lookbehind

我正在尝试构建一个正则表达式,它恰好匹配类中两次出现的char。这是我制作的正则表达式:

(?<!\1)([^raol1c])\1(?!\1)

正如你所看到的,它使用了前瞻和后方的底片。但是,像往常一样,后者不起作用;当它明显具有最大长度(恰好是一个字符)时,java抛出众所周知的异常“后视组没有明显的最大长度”。

理想情况下,正则表达式应匹配“hh”,“jhh”,“ahh”,“hhj”,“hha”而不是“hhh”。

有关如何处理此问题并制定解决方法的任何想法?

1 个答案:

答案 0 :(得分:4)

这是一种解决方法。它很丑,但显然它有效:

(?<!(?=\1).)([^raol1c])\1(?!\1)

将反向引用置于lookbehind内部的零长度前瞻中,使得lookbehind肯定具有固定长度。

免责声明,我(不幸的是)没有提出这个问题:Backreferences in lookbehind

修改

由于某种原因,上述模式不排除hhh。但是,这有效:

(?<!(.)(?=\1))([^raol1c])\2(?!\2)

如果我们在lookbehind中创建第一个组,那么我们可以使用它来确保lookbehind之后的第一个字符与之前的字符不同。

Working demo.