Можете ли вы использовать обратные ссылки в ретроспективе?
Допустим, я хочу 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)(.)
? - person Tim Pietzcker   schedule 29.04.2010PatternSyntaxException
. Кстати, если кто-то хочет поиграть с вариантом этой проблемы, я просто написал его на codingBat: codingbat. com / prob / p266235 - person polygenelubricants   schedule 29.04.2010