7

我正在尝试构建一个正则表达式,它与一个类中出现的两次字符完全匹配。这是我制作的正则表达式:

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

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

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

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

4

1 回答 1

6

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

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

将反向引用放入lookbehind 内的零长度lookahead 中,使得lookbehind 肯定具有固定长度。

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

编辑:

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

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

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

工作演示。

于 2013-05-20T16:58:27.797 回答