Können Sie Rückverweise in einem Lookbehind verwenden?Rückverweise in Lookbehind
Lassen Sie uns sagen, ich möchte split
wo immer hinter mir ein Zeichen zweimal wiederholt wird.
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!)]"
Mit REGEX2
(wo ist die Rückreferenzierung in einem Look-Ahead in einem Lookbehind verschachtelt) funktioniert, aber REGEX1
gibt diesen Fehler zur Laufzeit:
Look-behind group does not have an obvious maximum length near index 8
(?<=(.)\1)
^
Diese Art Sinn machen, ich Angenommen, die Rückreferenz kann im Allgemeinen eine Zeichenfolge beliebiger Länge erfassen (wenn der Regex-Compiler ein bisschen schlauer ist, könnte es jedoch in diesem Fall \1
(.)
bestimmen und hat daher eine endliche Länge).
Gibt es also eine Möglichkeit, eine Rückreferenz in einem Lookbehind zu verwenden?
Und wenn nicht, können Sie immer mit diesem verschachtelten Lookahead umgehen? Gibt es andere gebräuchliche Techniken?
Interessant und +1 für Ihre geniale Problemumgehung. Ich benutze kein Java, also kann ich es nicht selbst ausprobieren - was passiert, wenn die rückreferenzierte Gruppe außerhalb des Lookarounds ist, wie '(? <= \\ 1) (.)'? –
@Tim: Es ergibt sich im Wesentlichen die gleiche 'PatternSyntaxException'. By the way, wenn jemand mit einer Variante dieses Problems herumspielen will, habe ich nur eine auf codingBat geschrieben: http://codingbat.com/prob/p266235 – polygenelubricants
@polygene lubricants Ich wünschte, ich könnte diese Regex upvote: (? <= (? = (.) \\ 1) ..) für mindestens 10 mal. sehr elegant! – Eugene