正则表达式效率优化全解析
1. 测试与回溯基础
在使用正则表达式时,我们会遇到各种常见情况。为了评估特定正则表达式的效率,我们会关注两个关键指标:单个测试次数和回溯次数。例如,用 !marty" 匹配 smarty 时,会进行 6 次单个测试,即从最初用 !m" 匹配 s (失败)开始,接着依次匹配 m 、 a 等。此例中回溯次数为 0,但正则引擎隐式回溯到第二个字符位置重试也算一次回溯。
需要注意的是,不同工具的这些“精确”数字可能不同,我们更应关注示例的基本相对性能。部分工具会采用优化策略,若能提前判定目标字符串无法匹配,就会跳过特定正则表达式的应用。
2. 传统 NFA 与 POSIX NFA 的区别
分析正则表达式效率时,要明确目标工具的引擎类型,是传统 NFA 还是 POSIX NFA。有些问题对一种引擎重要,对另一种则不然;有时一个改变对一种引擎无影响,却对另一种影响巨大。
3. 一个发人深省的例子
以正则表达式 !"(\\.<[ˆ\\"])," 匹配带转义引号的字符串为例,若使用 NFA 引擎,每个字符处的交替操作效率极低。遇到正常字符(非转义、非引号)时,引擎需先测试 !\\." ,失败后回溯,最终用 ![ˆ\\"]" 匹配。若对效率有要求,就需优化此正则表达式。
超级会员免费看
订阅专栏 解锁全文
14

被折叠的 条评论
为什么被折叠?



