2015-05-22 4 views
5

Wir haben einen ziemlich komplexen regulären Ausdruck, der nach String-Struktur sucht.So erhalten Sie das erste Zeichen, das reg-Ausdruck verursacht, nicht zu entsprechen

Ich frage mich, ob es eine einfache Möglichkeit gibt herauszufinden, welches Zeichen in der Zeichenfolge, die Reg-Ausdruck verursacht, nicht übereinstimmen.

Zum Beispiel

string.match(reg_exp).get_position_which_fails 

Grundsätzlich ist die Idee, wie „Position“, um die Zustandsmaschine, wenn es aufgegeben. Hier

ist ein Beispiel für reguläre Ausdrücke:

%q^[^\p{Cc}\p{Z}]([^\p{Cc}\p{Zl}\p{Zp}]{0,253}[^\p{Cc}\p{Z}])?$ 
+4

Was schlägt in '' abad'match/ae/'? Dieses Problem hat einfach keine adäquate Lösung. – mudasobwa

+0

Es kann hilfreich sein, wenn Sie den regulären Ausdruck posten könnten. – hwnd

+0

Sie möchten herausfinden, wie viele Zeichen vor dem ersten Fehler gefunden wurden. Wenn der passende Ausdruck einfach genug ist, können Sie eine Regex erstellen, die immer übereinstimmt und auf diese Weise gute Gruppen sammelt. Etwas wie '/ (f?) (A?) (I?) (L?) (H?) (E?) (R?) (E?) /' Wird mit den ersten 4 Zeichen von "failNow" übereinstimmen. [Test] (https://regex101.com/r/uM4vB7/1) –

Antwort

7

Die kurze Antwort lautet: Nein .

Die lange Antwort ist, dass ein regulärer Ausdruck eine komplizierte endliche Zustandsmaschine ist, die in einem Zustand sein kann, der versucht, mehrere verschiedene mögliche Pfade gleichzeitig zu treffen. Es gibt keine Möglichkeit, eine partielle Übereinstimmung aus einem regulären Ausdruck zu erhalten, ohne einen regulären Ausdruck zu erstellen, der partielle Übereinstimmungen zulässt.

Wenn Sie Teilübereinstimmungen zulassen möchten, müssen Sie Ihren Ausdruck entweder neu konstruieren, um sie zu unterstützen, oder einen Parser schreiben, der den String mit einer manuelleren Methode durchläuft.

Sie könnten versuchen, eines davon automatisch mit Ragel zu generieren, wenn Sie einen besonders schwierigen Ausdruck zu lösen haben.

Verwandte Themen