2016-03-21 20 views
1

Ich bin mir bewusst, negative Rückblicke müssen Null Breite sein, aber ich habe ein Problem festgestellt, wo sie nicht funktionieren, wenn das vorhergehende Token optional ist. Warum passiert das?Was ist der effizienteste Weg, um ein negatives Lookbehind für einen optionalen Wert zu erhalten?

Fehler bei test123. Aber passiert test:123

Gibt es eine andere Lösung als (?<!test|test:)? Ich würde eher die obige Lösung vermeiden, da die Regex, auf die ich das anwenden möchte, bereits eine Menge negativer Look-Back-Phrasen hat, die ich verdoppeln würde.

Edit: Ich stellte zunächst das einen PCRE-Editor, aber ich bin Codierung mit ICU

+0

Ist es für PCRE? –

+0

Ich benutze einen PCRE-Online-Tester für meine ICU-Ausdrücke und füge dann einfach die zusätzlichen Backslashes hinzu, damit beides für mich gut ist. Ich bekomme die gleichen Ergebnisse in meiner schnellen ICU Regex und der PCRE Web App. Die Web-App ist einfach viel einfacher zu teilen und experimentieren mit. – Deco

+0

Mit ICU können Sie '(?

Antwort

1

Mit den ICU Regex-Engine, erhalten Sie einen Zugang zu einem Constrained-Breite Lookbehind, die Begrenzung Verwendung erlaubt Quantoren bekannter Länge innerhalb der Lookbehinds.

So verwenden

(?<!test:{0,1})\d{3} 
     ^^^^^^ 

Die :{0,1} wird : Eins oder Null entsprechen.

Beachten Sie, dass ICU regex nicht das gleiche wie PCRE funktioniert, Sie sollten sich der Unterschiede bewusst sein, wenn Sie in einer inkompatiblen Umgebung wie regex101.com testen.

Einige coole PCRE Funktionen, die in ICU fehlen:

  • (*SKIP)(*FAIL) Verben
  • \K Betreiber

einige coole ICU-Funktionen in PCRE fehlt:

  • Constrained breiten- lookbehind ((?<!test:{0,1})\d{3})
  • Zeichenklasse Kreuzung ([\p{Letter}&&\p{script=cyrillic}]) oder Subtraktion ([\p{Letter}--\p{script=latin}])