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).
(?<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.(?(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!