首页 >后端开发 >C++ >正则表达式能否有效平衡括号?

正则表达式能否有效平衡括号?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-16 14:48:11901浏览

Can Regular Expressions Effectively Balance Parentheses?

使用正则表达式验证平衡括号

虽然正则表达式很强大,但仅使用正则表达式完美平衡括号本质上是困难的。 但是,我们可以创建一个正则表达式,可以有效验证特定上下文中的平衡括号。 下面的方法演示了一种方法:

用于括号验证的正则表达式:

<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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn