Abgleich verschachtelter Klammern ohne Rekursion oder Ausgleichsgruppen
Abgleich verschachtelter Klammern mit regulären Ausdrücken kann sich als Herausforderung erweisen, insbesondere in Sprachen wie Java, wo Rekursion vorherrscht und Bilanzkreise werden nicht unterstützt. Glücklicherweise ist es tatsächlich möglich, diese Einschränkung mithilfe von Vorwärtsverweisen zu überwinden.
Übereinstimmende äußere Gruppen
Der folgende reguläre Ausdruck [1] stimmt mit äußeren Gruppen von überein Klammern ohne Begrenzung der Tiefe:
(?=\()(?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)
Hier sucht der Ausdruck nach öffnenden Klammern, schließt nicht übereinstimmende öffnende Klammern aus und erfasst die entsprechenden schließenden Klammern. Die erfassten Teilzeichenfolgen sind zwar nutzlos, dienen aber als Platzhalter, um die Übereinstimmung zu vervollständigen.
Übereinstimmende innere Gruppen
Um innere Gruppen einzubeziehen, können wir den folgenden Ausdruck erfassen [2]:
(?=\()(?=((?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)))
Durch Hinzufügen einer einfangenden Gruppe und Anpassen der Rückreferenzindizes erfasst dieser Ausdruck auch die inneren Gruppen.
So funktioniert es
Die Methode durchläuft die Zeichenfolge und passt die nächste öffnende und schließende Klammer an, während sie jeweils die verbleibende Zeichenfolge erfasst. Die Lookaheads sorgen dafür, dass die Klammern ausgewogen übereinstimmen.
Der Ausdruck ist wie folgt aufgebaut:
Component | Description |
---|---|
(?=() | Asserts that '(' precedes complex parsing |
(?: | Start of non-capturing group for repeated string processing |
(?= | Assert that the next '(' follows |
.?((?!.?1) | Match until the next '(' not followed by group 1 |
(.)(?!.2).* | Fill group 1 with the string, ensuring another ')' exists |
) | Assert that the matching ')' is valid |
.?)(?!.?2) | Assert that the next ')' not followed by group 2 exists |
(.*) | Fill group 2 with the remaining string |
) | Assert that the matching ')' is valid |
Consume a single character to continue matching within the group | |
) ? | Repeat the group (in the inner loop) |
.*?(?=1) | Match up to and including the last '(' found |
1*(?=2$) | Match up to the last ')' (but within the valid group) |
Diese Methode ermöglicht einen effizienten Abgleich verschachtelter Klammern, ohne dass Rekursion oder Ausgleichsgruppen erforderlich sind.
Das obige ist der detaillierte Inhalt vonKönnen verschachtelte Klammern ohne Rekursion oder Ausgleichsgruppen abgeglichen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!