你能在后顾之忧中使用回溯引用吗?
假设我想要在一个字符重复两次的位置进行split
分割。
String REGEX1 = "(?<=(.)\\1)"; // DOESN'T WORK!
String REGEX2 = "(?<=(?=(.)\\1)..)"; // WORKS!
System.out.println(java.util.Arrays.toString(
"Bazooka killed the poor aardvark (yummy!)"
.split(REGEX2)
)); // prints "[Bazoo, ka kill, ed the poo, r aa, rdvark (yumm, y!)]"
使用REGEX2
(其中反向引用位于嵌套在回顾后面的前瞻中)可以正常工作,但是REGEX1
在运行时会出现以下错误:
Look-behind group does not have an obvious maximum length near index 8
(?<=(.)\1)
^
这有点说得通,我想,一般来说反向引用可以捕获任意长度的字符串(如果正则表达式编译器更聪明一些,它可以确定在这种情况下
\1
是(.)
,因此具有有限的长度)。那么有没有办法在回顾后面使用反向引用呢?
如果没有,你是否总是可以使用这个嵌套的前瞻来解决它?还有其他常用技巧吗?
(?<=\\1)(.)
会发生什么? - Tim Pietzcker