2015-06-06 16 views
7

Die PCRE-Regex /..(?<=(.)\1)/ kann nicht kompiliert werden: "Submuster-Referenzen sind innerhalb einer Lookbehind-Assertion nicht erlaubt." Interessanterweise scheint es in Lookaheads akzeptabel zu sein, wie /(?=(.)\1)../, nur nicht in Lookbehinds.PCRE: Rückwärtsreferenzen in Lookbehinds nicht erlaubt?

Gibt es einen technischen Grund, warum Rückreferenzen in Lookbehinds speziell nicht erlaubt sind?

+0

Rückreferenzen können im Allgemeinen nicht innerhalb von Look-Behinds verwendet werden. Obwohl eine Umgehung möglich ist, '.. (? <= (? = (.) \ 1))' – hwnd

+0

Ich frage mich warum, speziell. Und es scheint immer seltsamer, dass sogar '/ .. (? <= (.) (? = \ 1).) /' Akzeptiert wird, wenn '/ .. (? <= (.) \ 1) /' nicht ist . –

+1

Dies liegt daran, dass Subpattern mit variabler Länge in einem Lookbehind nicht zulässig sind. Da eine Rückreferenz eine beliebige Länge haben kann, ist sie auch in einem Look-Behind nicht erlaubt. Bei pcre ist die klassische Problemumgehung (wenn möglich) die '\ K'-Funktion. –

Antwort

3

Mit Pythons re-Modul werden Gruppenreferenzen in Lookbehind nicht unterstützt, auch wenn sie Zeichenfolgen bestimmter fester Länge entsprechen.


Lookbehinds nicht vollständig PCRE Regeln unterstützen. Konkret, wenn die Regex-Engine einen Lookbehind erreicht, wird sie versuchen, ihre Größe zu bestimmen und dann zurückspringen, um die Übereinstimmung zu überprüfen.

Diese Größenbestimmung bringt Sie zu einer Wahl:

  • variabler Größe zu ermöglichen, dann wird jeder Lookbehind bevor ausgeführt werden muss, um springen zurück
  • variabler Größe nicht zulassen, dann können wir zurückspringen direkt

Da die erste Lösung für uns (Benutzer) die beste wäre, ist sie offensichtlich die langsamste und die am schwierigsten zu entwickelnde. Und so entschieden sie sich für PCRE Regex, die zweite Lösung zu verwenden. Die Java-Regex-Engine ermöglicht beispielsweise ein Semi-Variablen-Lookbehind: Sie müssen nur die maximale Größe bestimmen.


Ich kam zu PCRE und Python re-Modul.

Kompilierungsfehler CODES
25: Lookbehind Behauptung ist nicht feste Länge

Aber in diesem Fall ist die Behauptung Lookbehind
Ich habe nichts anderes in PCRE documentation als dieser Fehlercode gefunden ist
feste Länge.
Hier ist, was wir in re documentation finden:

Das enthaltene Musterzeichenfolgen einiger fester Länge passen nur müssen, was bedeutet, dass abc oder a | b erlaubt sind, aber a * und a {3,4 } sind nicht. Gruppenreferenzen werden nicht unterstützt, auch wenn sie Zeichenfolgen mit fester Länge entsprechen.

Wir haben unsere Schuld ... Wenn Sie möchten, können Sie die Python's regex module versuchen, die variable Länge Lookbehind zu unterstützen scheint.

+0

Haben Sie Referenzen, um Ihren Standpunkt zu belegen? Vielleicht ein Auszug aus dem PCRE-Quellcode? Es würde überzeugender klingen. –

+0

@Stribizhev Ich fand den Ursprung, tief in der Dokumentation. – zessx