Ein regulärer Ausdruck für b
-
12-09-2019 - |
Frage
Ich schreibe regelmäßige Ausdrücke für Unicode -Text in Java. Für das bestimmte Skript, das ich verwende - Devanagari (0900 - 097F), gibt es ein Problem mit Wortgrenzen. b entspricht Zeichen, die abhängige Vokale sind (wie 093E-094c), da sie wie Raumzeichen behandelt werden.
Beispiel: Angenommen, ich habe die Zeichenfolge: "कमल कमाल कम्हल कम्हाल" Beachten Sie, dass 'मा' im 2. Wort gebildet wird, indem म und uckert (als Raumfigur erkannt) kombiniert wird. Ähnlich im letzten Wort. Dies führt dazu, dass b das 'ल' in 'कमाल' mit regulärem Ausdruck b w b übereinstimmt, der gemäß der Sprache nicht korrekt ist.
Ich hoffe das Beispiel hilft.
Kann ich einen regulären Ausdruck schreiben, der sich wie B verhält, außer dass er nicht zu bestimmten Zeichen passt? Jedes Feedback wird dankbar sein.
Lösung
Sie sollten in der Lage sein, das zu erreichen, was Sie mit den folgenden Regex -Betreibern wollen:
(?=X) X, via zero-width positive lookahead
(?!X) X, via zero-width negative lookahead
(?<=X) X, via zero-width positive lookbehind
(?<!X) X, via zero-width negative lookbehind
(Das obige wird aus dem zitiert Java 6 Muster -API -Dokumente.)
Verwenden (?<![foo])(?=[foo])
anstelle von \b
vor einem Wort und (?<=[foo])(?![foo])
anstelle von \b
Nach einem Wort, wo "[foo]
"Ist dein Satz" Wortzeichen "
Andere Tipps
Das Äquivalent für Wortgrenzen (wenn die Grenzen nicht das sind, was Sie erwartet haben) wäre:
(?<!=[x-y])(<?=[x-y])...(?<=[x-y])(?![x-y])
Das liegt daran, dass eine "Wortgrenze" "einen Ort bedeutet, an dem sich auf der einen Seite ein Charakter befindet und nicht auf der anderen Seite)
Mit Ausdrucksformen aus Look-Fehen und Look-Shead können Sie Ihre eigene Zeichenklasse [XY] definieren, um zu überprüfen, wann Sie eine "Wortgrenze" isolieren möchten.