Ü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:
So funktioniert es:
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 '(' |
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!