Perl正则表达式的增强与效率优化
嵌套括号匹配正则表达式
在正则表达式匹配完成后,需要检查括号计数是否为零。若不为零,说明没有足够的右括号来平衡左括号,匹配应失败。以下是相应的正则表达式:
my $NestedGuts = qr{
(?{ local $OpenParens = 0 }) # 统计等待闭合的嵌套左括号数量
(?> # 原子分组以提高效率
(?:
# 非括号内容
[^()]+
# 左括号
;
\(
(?{ $OpenParens++ })
# 若有期望的右括号,则允许匹配
;
\) (?(?{ $OpenParens != 0 }) (?{ $OpenParens-- }) ; (?!) )
)+
)
(?(?{ $OpenParens != 0 })(?!)) # 若还有未闭合的左括号,不完成匹配
}x;
这里使用 local
是为了将该正则表达式对 $OpenParens
的使用与程序中该全局变量的其他使用隔离开。原子分组不仅提高了效率,还确保了匹配的文本不会因回溯而被“取消匹配”,从而保证了 $OpenParens
的值与实际匹配的括号数量同步。
重载正则表达式字面量