[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 9# xczxczxcz


    这里的“固化分组”并非多余,而是必须。
'([^()]+)*' 正则这样写,如果匹配失败,很容易引起 "灾难性回溯",或称 "无休止回溯"。

https://blog.csdn.net/weixin_40619578/article/details/127287867

TOP

回复 20# xczxczxcz


    好好看看"精通正则表达式第三版"第6章,第225页开始就是说的这个问题: "过渡回溯"。
.NET和其它如JAVA、PHP等等正则,都是基于传统NFA型的,我从来不认为这个很好,那个很垃圾。

TOP

本帖最后由 WHY 于 2023-6-11 20:59 编辑

可能是我没有表达清楚什么意思,也可能是我高估了有些人的理解能力。

顶楼的正则,抛开所谓的"平衡组",可以这样写:
'\((?>[^()]+|\(|\))*\)'

如果取消固化分组,可以这样写:
'\(([^()]+|\(|\))*\)'

这与《精通正则表达式(第三版)》第225页的例子:"(\\.|[^"\\]+)*" 如出一辙。
第268页 "使用固化分组和占有优先量词" 已经把引起灾难性回溯的原因及解决办法说得很清楚了。

什么时候匹配失败会引起灾难性回溯?
比如:
  1. '(abcdefghijklmnopqrstuvwxyz' -match '\(([^()]+|\(|\))*\)'  
复制代码
当然,如果认为《精通正则表达式(第三版)》很烂,或者认为这本书已经过时,那我无话可说。

TOP

返回列表