Heim > Backend-Entwicklung > C++ > Können reguläre Ausdrücke Klammern effektiv ausgleichen?

Können reguläre Ausdrücke Klammern effektiv ausgleichen?

Mary-Kate Olsen
Freigeben: 2025-01-16 14:48:11
Original
901 Leute haben es durchsucht

Can Regular Expressions Effectively Balance Parentheses?

Verwenden regulärer Ausdrücke zur Validierung ausgeglichener Klammern

Während reguläre Ausdrücke leistungsstark sind, ist es von Natur aus schwierig, Klammern perfekt auszugleichen, wenn nur Regex verwendet wird. Wir können jedoch einen regulären Ausdruck erstellen, der ausgeglichene Klammern innerhalb eines bestimmten Kontexts effektiv validiert. Der folgende Ansatz demonstriert eine Methode:

Regex für Klammervalidierung:

<code>func([a-zA-Z_][a-zA-Z0-9_]*) # Function name

\(                      # Opening parenthesis
    (?:                 
    [^()]               # Match any character except parentheses
    |
    (?<open> \( )       # Match opening parenthesis, add to 'open' stack
    |
    (?<-open> \) )      # Match closing parenthesis, remove from 'open' stack
    )+
    (?(open)(?!))       # Fails if 'open' stack is not empty
\)                      # Closing parenthesis</code>
Nach dem Login kopieren

Wie es funktioniert:

Diese Regex nutzt Ausgleichsgruppen (verfügbar in vielen Regex-Engines, aber nicht in allen).

  • Benannte Capture-Gruppen: (?<open> ( ) und (?<-open> ) ) verwenden benannte Capture-Gruppen. (?<open> ...) fügt einem Stapel mit dem Namen „open“ eine passende öffnende Klammer hinzu. (?<-open> ...)entfernt eine übereinstimmende schließende Klammer aus dem „offenen“ Stapel.
  • Bedingte Prüfung: (?(open)(?!)) ist ein bedingter Ausdruck. Es prüft, ob der „offene“ Stapel leer ist. Wenn es nicht leer ist (unausgeglichene Klammern), schlägt die gesamte Übereinstimmung fehl.

Beispiel:

Gegebene Eingabezeichenfolge: "test -> funcPow((3),2) * (9 1)"

Der reguläre Ausdruck identifiziert "funcPow((3),2)" korrekt als einen ausgeglichenen Klammerausdruck. Es wird nicht übereinstimmen "funcPow((3),2) * (9 1), weil die äußeren Klammern unausgeglichen sind.

Einschränkungen:

Diese Regex funktioniert nur für Klammern, die sich direkt auf einen Funktionsaufruf beziehen (wie durch func([a-zA-Z_][a-zA-Z0-9_]*) definiert). Verschachtelte Funktionsaufrufe innerhalb der Klammern werden nicht behandelt. Für einen wirklich robusten Klammerausgleich über komplexe verschachtelte Strukturen hinweg ist im Allgemeinen ein nicht auf Regex basierender Ansatz (wie ein stapelbasierter Algorithmus) erforderlich.

Das obige ist der detaillierte Inhalt vonKönnen reguläre Ausdrücke Klammern effektiv ausgleichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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