Abgleichen verschachtelter Klammern ohne Rekursion oder Ausgleichsgruppen
Abgleichen verschachtelter Klammern mithilfe regulärer Ausdrücke kann sich als Herausforderung erweisen, insbesondere in Sprachen wie Java, in denen es zu Rekursionen kommt 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:
(?=\()(?:(?=.*?\((?!.*?\1)(.*\)(?!.*\2).*))(?=.*?\)(?!.*?\2)(.*)).) ?.*?(?=\1)[^(]*(?=\2$)
Hier sucht der Ausdruck nach öffnenden Klammern, schließt nicht übereinstimmende öffnende Klammern aus und erfasst die entsprechenden schließenden Klammern, obwohl sie nutzlos sind, dienen sie als Platzhalter, um die Übereinstimmung zu vervollständigen.
Übereinstimmende innere Gruppen
Um innere Gruppen einzubeziehen, können wir den folgenden Ausdruck erfassen [2]:
(?=\()(?=((?:(?=.*?\((?!.*?\2)(.*\)(?!.*\3).*))(?=.*?\)(?!.*?\3)(.*)).) ?.*?(?=\2)[^(]*(?=\3$)))
Durch Hinzufügen einer Erfassungsgruppe und Durch Anpassen der Rückreferenzindizes erfasst dieser Ausdruck auch die inneren Gruppen.
So funktioniert es
Die Methode iteriert durch die Zeichenfolge und passt dabei die nächste öffnende und schließende Klammer an Erfassen der jeweils verbleibenden Zeichenfolge. Die Lookaheads sorgen dafür, dass die Klammern ausgewogen übereinstimmen.
Der Ausdruck ist wie folgt aufgebaut:
↩
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3