ich einen grundlegenden Text Template-Engine, die eine Syntax wie folgt verwendet:Regulärer Ausdruck, die Bilanzkreise verwendet
foo bar
%IF MY_VAR
some text
%IF OTHER_VAR
some other text
%ENDIF
%ENDIF
bar foo
Ich habe ein Problem mit dem regulären Ausdruck, den ich verwende es zu analysieren, wobei es nicht statt Berücksichtigung der verschachtelten IF/ENDIF-Blöcke.
Die aktuelle regex Ich verwende ist: %IF (?<Name>[\w_]+)(?<Contents>.*?)%ENDIF
Ich habe auf den Ausgleich Capture-Gruppen (eine Funktion von .NET regex Bibliothek) zu lesen, wie ich verstehen, das ist die empfohlene Methode „rekursiven“ regex ist der Unterstützung in .NET.
Ich spiele mit Gruppen Balancing und haben so kam weit mit dem Follow-up:
(
(
(?'Open'%IF\s(?<Name>[\w_]+))
(?<Contents>.*?)
)+
(
(?'Close-Open'%ENDIF)(?<Remainder>.*?)
)+
)*
(?(Open)(?!))
Aber dieses Verhalten ist nicht ganz, wie ich erwarten würde. Es fängt zum Beispiel viele leere Gruppen ein. Hilfe?
All dies beiseite, in Betracht ziehen, einen Parser zu verwenden, sollte es sich darum kümmern. – Kobi
Das ist brilliant. Vielen Dank. Ich habe eine Rekursion in mein Programm eingefügt, so dass es die verschachtelten if/endif Blöcke durchquert. – nbevans
Kleinere Ausgabe, die hoffentlich leicht zu beheben ist ... betrachte diesen Eingabetext: '% IF MY_VAR Text% IF OTHER_VAR% ENDIF'. Beachten Sie, dass die innere OTHER_VAR nicht mit einem ENDIF geschlossen ist. Die Regex stimmt jedoch mit dem inneren Block überein und nicht mit dem äußeren Block. Wie kann ich erreichen, dass die Regex in diesem speziellen Szenario (d. H. Fehlerhafte Vorlage) auf den äußersten Block passt und nicht direkt auf den inneren Block springt? – nbevans