Nested Regex

Rippa_HD

Mitglied
Hi,

ich bin dabei eine Art Parser für Formeln zu schreiben.

Vereinfacht kann man sagen ich lasse einen Regex über eine Formel laufen und prüfe, ob die Formel gültig ist. Ich hab insgesamt 3 Regex Ausdrücke für String, Float und Int Formeln, damit ich auch prüfen kann ob der Rückgabetyp eingehalten ist.

Mein Problem sind eigentlich nur noch die Klammern, die man in solchen Formeln beliebig einsetzen kann, ich hab gelesen dass das über ein Nested Konstrukt in dem Regex möglich sein soll aber die Erklärung dort war recht mager, kennt sich vielleicht jemand von euch damit aus?

Hier mein Codebeispiel für die Stringformel:

Code:
(...)
string strValues = @"("+ itemFormulaPattern + propStringPattern + "|" + stringPattern + "|" + stringFormulaPattern + @")";
string formulaStringPattern = @"^ \s* " + strValues + @" (\s* [+] \s* " + strValues + @" \s* )* $";

if(Regex.IsMatch(formel,formulaStringPattern,RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace)
{
 ...
}

(...)

strValues enthält in dem Beispiel alle Werte und Formeln die in einem String erlaubt sind, der stringPattern erlaubt ein Vorkommen von strValues das optional von beliebig vielen + und weiteren stringValues gefolgt werden kann. Dazwischen sind natürlich Leerzeichen erlaubt.

In diesen Pattern muss ich nun bei den Leerzeichen auch noch die Klammern einfügen, dass man die Werte beliebig Gruppieren kann, klar bei dem String macht das nicht viel Sinn bei den Float und Int Formeln schon eher, die sind aber länger deshalb wollt ich die nicht gleich posten.

Bin für jede Antwort dankbar.

MfG Robert
 
Hi,

ich hab mich mal grad drangesetzt und die Lösung selbst gefunden, wenns jemanden interessiert hier der neue Code:

Code:
string depthUp = @"(?:\s|\((?<DEPTH>))*";
string depthDown = @"(?:\s|\)(?<-DEPTH>))*";

formulaStringPattern = @"^"+ depthUp + strValues + @" \s* ([+] " + depthUp + strValues + depthDown + @")* (?(DEPTH)(?!)) $";

depthUp steht für beliebig viele Leerzeichen und Öffnende Klammern und die Anzahl der öffnenden Klammern wird in DEPTH gesichert. depthDown steht für Leerzeichen und schließende Klammern und zieht die Anzahl der schließenden Klammern von DEPTH wieder ab.

Mit (?(DEPTH)(?!)) wird dann geprüft, ob DEPTH am Ende wieder 0 ist.

Erlaubt sind z.B.
"Hallo" + ("Hallo" + "Hallo")

nicht erlaubt z.B.
"Hallo" + ("Hallo" +) "Hallo"
oder
"Hallo" + ("Hallo" + "Hallo"))

funktioniert eigentlich ganz gut soweit ich das bis jetzt beurteilen kann. Ich hab das aus dem Buch "Mastering Regular Expressions 2nd Edition", kann das Teil nur weiter empfehlen :)

MfG
 
Zurück