使用正则表达式验证平衡括号
虽然正则表达式很强大,但仅使用正则表达式完美平衡括号本质上是困难的。 但是,我们可以创建一个正则表达式,可以有效验证特定上下文中的平衡括号。 下面的方法演示了一种方法:
用于括号验证的正则表达式:
<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>
工作原理:
此正则表达式利用平衡组(在许多正则表达式引擎中可用,但并非全部)。
(?<open> ( )
和 (?<-open> ) )
使用命名捕获组。 (?<open> ...)
将匹配的左括号添加到名为“open”的堆栈中。 (?<-open> ...)
从“开放”堆栈中删除匹配的右括号。(?(open)(?!))
是条件表达式。它检查“打开”堆栈是否为空。如果不为空(括号不平衡),则整个匹配失败。示例:
给定输入字符串:"test -> funcPow((3),2) * (9 1)"
正则表达式正确地将 "funcPow((3),2)"
识别为平衡括号表达式。 它不会匹配"funcPow((3),2) * (9 1)
,因为外括号不平衡。
限制:
此正则表达式仅适用于与函数调用直接相关的括号(由 func([a-zA-Z_][a-zA-Z0-9_]*)
定义)。 不处理括号内的嵌套函数调用。 为了在复杂的嵌套结构之间实现真正强大的括号平衡,通常需要基于非正则表达式的方法(例如基于堆栈的算法)。
以上是正则表达式能否有效平衡括号?的详细内容。更多信息请关注PHP中文网其他相关文章!