Heim > Java > javaLernprogramm > Hauptteil

Kann Regex verschachtelte Klammern ohne Rekursion oder Ausgleichsgruppen abgleichen?

Patricia Arquette
Freigeben: 2024-10-25 02:37:02
Original
437 Leute haben es durchsucht

Can Regex Match Nested Brackets Without Recursion or Balancing Groups?

Übereinstimmende verschachtelte Klammern ohne Rekursion oder Ausgleichsgruppen

Die Herausforderung:
Können Regex-Ausdrücke, wie z diejenigen in Javas java.util.regex, passen willkürlich verschachtelte Klammern an, ohne auf Rekursion oder Ausgleichsgruppen angewiesen zu sein?

Die Lösung:
Ja, es ist möglich, Vorwärtsreferenzen zu verwenden:

(?=\()(?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)
Nach dem Login kopieren

So funktioniert es:
Dieser Ausdruck besteht aus mehreren Lookaheads und Vorwärtsreferenzen, die zusammenarbeiten, um verschachtelte Gruppen von Klammern zu identifizieren:

  • (? =() stellt sicher, dass das nächste Zeichen eine öffnende Klammer ist.
  • (?:...) ?.*?(?=...): Eine nicht einfangende Gruppe, die die Zeichenfolge durchläuft.
  • (?=.*?((?!.*?1): Lookahead, um die nächste öffnende Klammer zu finden, die nicht Teil der bereits übereinstimmenden Gruppe ist (erfasst in 1).
  • (.*)(?!.*2).*): Erfasst den Rest der Zeichenfolge und entspricht mindestens einer zusätzlichen schließenden Klammer.
  • (?=.*?)(?!.*?2 ): Vorausschauen, um die nächste schließende Klammer zu finden, die nicht Teil der bereits übereinstimmenden Gruppe ist (erfasst in 2).
  • .*?(?=1): Entspricht bis einschließlich der letzten gefundenen öffnenden Klammer .
  • [^(]*(?=2$): Übereinstimmung bis zur letzten gefundenen schließenden Klammer, um sicherzustellen, dass zwischen ihnen keine öffnenden Klammern mehr vorhanden sind.

Beispiel:
Die folgende Zeichenfolge stimmt mit drei verschachtelten Gruppen überein:

(F(i(r(s)t))) ((S)(e)((c)(o))(n)d) (((((((Third)))))))
Nach dem Login kopieren

Übereinstimmende innere Gruppen:
Um innere Gruppen abzugleichen, kann eine Erfassungsgruppe hinzugefügt werden bis zum Ende des Ausdrucks:

(?=\()(?=((?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)))
Nach dem Login kopieren

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

Quelle:php
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!