Heim >Java >javaLernprogramm >Wie passt man verschachtelte Klammern ohne Rekursion oder Ausgleichsgruppen an?

Wie passt man verschachtelte Klammern ohne Rekursion oder Ausgleichsgruppen an?

DDD
DDDOriginal
2024-10-25 02:35:02462Durchsuche

How to Match Nested Brackets Without Recursion or Balancing Groups?

Übereinstimmen verschachtelter Klammern ohne Rekursion oder Ausgleichsgruppen

Herausforderung:

Passen Sie eine Reihe von an Beliebig verschachtelte Klammern unter Verwendung einer Regex-Variante, der Rekursion und Ausgleichsgruppenunterstützung fehlt, wie etwa Javas java.util.regex, die drei äußere Gruppen innerhalb der angegebenen Zeichenfolge erfasst:

(F(i(r(s)t))) ((S)(e)((c)(o))(n)d) (((((((Third)))))))

Lösung: Verweise weiterleiten an die Rettung

Entgegen der landläufigen Meinung ist das Abgleichen verschachtelter Klammern ohne diese erweiterten Funktionen mithilfe von Vorwärtsverweisen möglich:

(?=\()(?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)

Aufschlüsselung:

Diese komplexe Regex arbeitet in zwei Phasen:

  • Stufe 1: Lookaheads identifizieren Sequenzen ausgeglichener Klammern, ohne Zeichen zu verbrauchen. Dieser Prozess wird fortgesetzt, bis eine vollständige äußere Gruppe gefunden wird.
  • Stufe 2: Eine erfassende Gruppe extrahiert den Inhalt der passenden äußeren Gruppe.

So funktioniert es:

  • Überprüfung auf „(“: Gehen Sie durch die Zeichenfolge, bis ein „(“ gefunden wird.
  • Übereinstimmung Ausgewogene Klammern:Verwenden Sie zwei Lookaheads, um sicherzustellen, dass die nächsten „(“ und „)“ auf ausgewogene Weise übereinstimmen und den inneren Inhalt erfassen.
  • Prüfung der schließenden Klammer:Prüfen Sie auf ein abschließendes ')', das mit dem zuvor übereinstimmenden '(' übereinstimmt, und gehen Sie weiter.
  • End-of-Outer-Group-Prüfung: Stellen Sie sicher, dass vor dem schließenden ' kein weiteres '(' erscheint. )' der äußeren Gruppe.

Abgleichsvariante für innere Gruppen:

Für den Abgleich innerer Gruppen bleibt die Strategie dieselbe, es wird jedoch eine einfangende Gruppe verwendet um den übereinstimmenden Inhalt in einem ausgewogenen Klammerpaar zu speichern:

(?=\()(?=((?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$))) 

Umfassende Aufschlüsselung:

Eine Tabelle fasst die Komponenten und Funktionen des regulären Ausdrucks zusammen:

Note Component Description
(?=() Look for '('
(?: Start group for iteration
(?=.?((?!.?1)) Look for '(' not followed by 1, which contains the matched inner content
(.)(?!.2).*)) Capture inner content and check for at least one more ')'
(?=.?)(?!.?3)) Look for ')' not followed by 2, which contains the matched outer content
(. ) Capture outer content
. Consume a character
) Close group
? Match as few times as possible
.*?(?=1) Match up to and including the last '('
1*(?=2$) Match up to the last ')' without encountering more '('

  1. (

Das obige ist der detaillierte Inhalt vonWie passt man verschachtelte Klammern ohne Rekursion oder Ausgleichsgruppen an?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn