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
Mary-Kate OlsenOriginal
2025-01-16 14:48:11903Durchsuche

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>

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!

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