Regex-Problem mit Klammern

Hallo Gumbo,

erstmal danke für deine bisherige Hilfe. Leider ist das noch nicht das gewünschte Ergebnis.:(

Wenn ich jetzt folgenden String habe: ttt (aaa, bbb(ccc) , ddd) ttt
dann matcht er mir: (ccc)

gesucht ist aber: (aaa, bbb(ccc) , ddd)

Das ist wirklich ganz schön verflixt...

Der String könnte sogar so aussehen: ttt (aaa, bbb(ccc(eee)) , ddd) ttt
gesucht wäre dann: (aaa, bbb(ccc(eee)) , ddd)

oder so: ttt (aaa, bbb , ddd) ttt
gesucht wäre dann: (aaa, bbb , ddd)
 
Zuletzt bearbeitet:
Hi...

bla (bla, bla(), bla) bla (blub(hipphipp), blub, blub), (hopp, hopp, hopp)

Erklär mal in Worten was er hier raussuchen soll.
Ich sehe in deinem Beispiel zwar die Lösung aber nach welchen angaben du gegangen bist ist mir nicht klar.

Jedes mal, wenn eine Klammer geöffnet wird soll es dir den Text auslesen, der in der Klammer steht - soweit kein Problem.

Aber, wenn in der Klammer noch eine Klammer steht soll es dir dies auch auslesen und "weiter" machen.

Das Problem ist wie erklärst du dem Programm welche Klammer jetzt eine Innereklammer ist und welche Klammer eine aussere Klammer?

Dein Muster wierd weder von einem Komma noch von sonst was erkennbar getrennt. Ausser ich bin zu doof.

Wenn du es in Worten erklären kannst ist es machbar sonst glaube ich eher nicht. Ausser Gumbo macht wieder ein Specialcode:D:p
 
Okay, ich gebe zu es wirkt alles etwas verwirrend.

Der String ist ein SQL-Statement, z.B. so eines:
INSERT INTO tab(spalteA, spalteB, spalteC) VALUES (1,2,3), (eins, zwei(), drei), (gleich, hier, NOW()), (bla, blub, funktion(NOW()))

gematcht werden soll nun
1. (spalteA, spalteB, spalteC)
2. (1,2,3)
3. (eins, zwei(), drei)
4. (gleich, hier, NOW())
5. (bla, blub, funktion(NOW()))

Das ist wirklich recht komplex glaube ich, aber nicht unmöglich.

Mir würde unter Umständen auch so eine Lösung reichen:
String: (1,2,3), (eins, zwei(), drei), (gleich, hier, NOW()), (bla, blub, funktion(NOW()))
Matches:
1. (1,2,3)
2. (eins, zwei(), drei)
3. (gleich, hier, NOW())
4. (bla, blub, funktion(NOW()))

Hoffe das macht das Ganze etwas verständlicher.
 
Ich denke mit Regulären Ausdrücken kommen wir da nicht weiter. Denn die Funktionen können sich ja quasi bis ins Unendliche verschachteln. Oder was ist, wenn in einer Zeichenkette eine öffnende aber keine schließende Klammer vorkommt? Das in einem Regulären Ausdruck zu berücksichtigen, halte ich für zu komplex.

Du wirst dir wohl einen eigenen Parser schreiben müssen, der jedes Zeichen einzeln durchgeht und dessen syntaktische Bedeutung analysiert.
 
Okay, ich habe nun selbst einen ersten Lösungsansatz:

String: ttt (aaa, bbb(ccc(xxx)) , ddd) ttt
Regex: \(.*?((\(.*?\))*(,)?)+\).*?\)
Match: (aaa, bbb(ccc(xxx)) , ddd)

Perfekt ist das zwar noch nicht, aber ich bin nun schon einen Schritt weiter.
 
Ich halte den Thread mal noch "am Leben", bis das Problem etwas mehr gelöst ist.

Ich bin nun auch wieder etwas weiter:
String: tada (aaa, bla bla) tada (xxx, ccc(xxx), fff)
Regex: (\([^\)]*((\([^\)]*\))+\s*(,)?)+[^\)]*\))|\(.*?\)
Match:
1. (aaa, bla bla)
2. (xxx, ccc(xxx), fff)

Bisher ist die Lösung aber immer noch nicht komplett :(
 
Ich glaube ich hab's:

String: INSERT INTO tab(colA, colB, colC) VALUES (xxx, ccc(xxx(sss(rrr))), fff),(aaa, bla bla), (li, la, lu())
Regex: (\([^\)]*((\([^\)]*\))+\s*(,)?)+[^\(]*\))|\(.*?\)
Match:
1. (colA, colB, colC)
2. (xxx, ccc(xxx(sss(rrr))), fff)
3. (aaa, bla bla)
4. (li, la, lu())

:-)

Nochmal danke an Gumbo, ohne dessen Ansatz ich es vermutlich nicht gepackt hätte. :)
 

Neue Beiträge

Zurück