Heim  >  Artikel  >  Java  >  Kann Regex verschachtelte Klammern ohne Rekursion oder Ausgleichsgruppen abgleichen?

Kann Regex verschachtelte Klammern ohne Rekursion oder Ausgleichsgruppen abgleichen?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-25 02:37:02441Durchsuche

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:

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

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)))))))

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

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

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!

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