【发布时间】:2011-02-13 15:59:51
【问题描述】:
你可以在后面使用反向引用吗?
假设我想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(其中反向引用位于lookahead 中嵌套在lookbehind 中)可以工作,但REGEX1 在运行时会出现此错误:
Look-behind group does not have an obvious maximum length near index 8
(?<=(.)\1)
^
我认为这种有点是有道理的,因为通常反向引用可以捕获任意长度的字符串(不过,如果正则表达式编译器更聪明一点,它可以确定\1在这种情况下是(.),因此长度有限)。
那么有没有办法在回溯中使用反向引用?
如果没有,您是否可以始终使用这种嵌套的前瞻来解决它?还有其他常用的技术吗?
【问题讨论】:
-
很有趣,并且为您的巧妙解决方法 +1。我不使用 Java,所以我不能自己尝试 - 如果反向引用组在环视之外会发生什么,例如
(?<=\\1)(.)? -
@Tim:它产生基本相同的
PatternSyntaxException。顺便说一句,如果有人想解决这个问题的变体,我刚刚在 codingBat 上写了一个:codingbat.com/prob/p266235 -
@polygenelubricants 我希望我能支持这个正则表达式: (?
标签: java regex lookbehind backreference