2016-03-23 9 views
1

I-Typ und Argumente in diesem Ausdruck trennen müssen:Rekursion in regulären Ausdruck funktioniert nicht

tf->get_TextState()->set_TextMatrix(std::shared_ptr<DOM::Matrix>(new DOM::Matrix(m->get_M11(), -m->get_M12()))); 

ich erstellen Sie die folgende regex:

std::shared_ptr[ \t]*<(?'type'[A-Z,:,_,a-z,<,>]*){1}>[ \t]*\([ \t]*new[ \t]*(\k'type'){1}(?'args'.*) 

Das Ergebnis ist:

Gruppe "Typ":

Gruppe "args": (m->get_M11(), -m->get_M12())));

das Problem in einer "args" Gruppe, weil ich brauche nur das: (m->get_M11(), -m->get_M12())

Für das tun, ich .* zu ändern: \([^()]*+(?:(?R)[^()]*+)*+\)

Dieser Ausdruck separetly sehr gut funktionieren auf: (m->get_M11(), -m->get_M12()))); Bei einem erwarteten Ergebnis Aber (m->get_M11(), -m->get_M12())

wenn ich hinzufüge es ganz Muster heißt:

std::shared_ptr[ \t]*<(?'type'[A-Z,:,_,a-z,<,>]*){1}>[ \t]*\([ \t]*new[ \t]*(\k'type'){1}(?'args'\([^()]*+(?:(?R)[^()]*+)*+\)) 

Es entspricht nichts. Was mache ich falsch?

+2

Welche Sprache ist das? Bitte markieren Sie Ihre Frage damit. – Bergi

+0

Was ist die Ausgabe, nach der Sie suchen (und was soll '* +' tun? – thebjorn

Antwort

0

Sie brauchen nur einen Unterprogramm-Aufruf zu verwenden, um die args Unter-Pattern mit (?&args), recurse aber nicht die ganzen Muster ((?R) recurses das gesamte Muster!).

Verwenden

std::shared_ptr\h*<(?'type'[A-Z:_a-z<>]*)>\h*\(\h*new\h*\k'type'(?'args'\([^()]*+(?:(?&args)[^()]*+)*+\)) 

Siehe regex demo

Bitte beachten, dass ich [ \t] mit \h ersetzt (entspricht es horizontal Leerzeichen), um das Muster zu verkürzen, entfernt redundante {1} quantifiers und Gruppen. BTW

, hier ist ein Alternativer Ausdruck, der die gleiche Sache tut:

std::shared_ptr\h*<(?'type'[A-Z:_a-z<>]*)>\h*\(\h*new\h*\k'type'(?'args'\((?>[^()]|(?&args))*\)) 

Siehe another demo

+0

Vielen Dank Wiktor! Leider kann ich die +1 nicht setzen, aber in meinem Fall schätze ich diese Antwort +10 – nen777w

+0

Froh, dass es funktioniert hat Wenn Sie meine Antwort hilfreich fanden, denken Sie bitte auch darüber nach, wie Sie es jetzt tun können, nachdem Sie 15 Wiederholungen erreicht haben. –