Hallo,
Ich habe ein Problem betreffend eines regulären Ausdruckes:
Ich bin dabei einen kleinen Parser für mathematische Terme zu schreiben.
Bevor diese Ausdrücke geparst werden, sollen sie jedoch erst "normalisiert" werden.
z.B. wird aus "6*(3+2)" -> "{VAR(6)},{MULT},{BROPEN},{VAR(3}{PLUS}..."
dies mache ich über regex, funktioniert auch ganz gut:
PHP-Code:
s = s.replaceAll("\\(", "{BROPEN}");
s = s.replaceAll("\\)", "{BRCLOSE}");
//Operatoren
for (int op : OPERATOR.getOperators()) {
for (String word : OPERATOR.getWords(op)) {
s = s.replace(word, "{" + OPERATOR.getWords(op)[0] + "}");
}
}
//Nums'n'Vars
s = s.replaceAll("(([a-z,'_'])+)", "{VAR($1)}");
s = s.replaceAll("(([0-9])+)", "{NUM($1)}");
//Leerzeichen weg
s=s.replace(" ", "");
//Noch Kommas einfügen
s = s.replace("}{", "},{");
Jetzt will ich aber auch einen Ausdruck der sowas macht:
"f(x)" -> "{FUNCTION(f,x)}"
Das ist ja ganz einfach, nur muss ich jetzt verhindern, dass jetzt die oberen Regeln wieder die Klammern im rechten Teil dieser Regel ersetzen.
Ich muss also die oberen Regeln anpassen, sodass sie nur dann ersetzen, wenn der zu-ersetzende Ausdruck noch nicht von geschweiften Klammern umgeben ist.
Geht sowas mit regex?
Grüße,
benny
P.S: das oben ist Java-Code, sollte für regex aber eigentlich keine Rolle spielen.