IT源码网

regex之为什么字符类比交替更快

zengkefu 2024年09月07日 程序员 88 0

在以下示例中,使用字符类似乎比交替更快:
[abc](a|b|c)
我听说有人推荐它,并使用 Time::HiRes 进行了简单测试,我验证了它(速度慢了约 10 倍)。
如果捕获括号产生差异,也可以使用 (?:a|b|c) ,但不会改变结果。
但我不明白为什么。我认为这是因为回溯,但我在每个位置看到的方式都有 3 个字符比较,所以我不确定回溯如何影响交替。这是实现的交替性质的结果吗?

请您参考如下方法:

这是因为交替之间的“OR”结构|回溯:如果第一个交替不匹配,引擎必须返回在交替匹配期间移动的指针位置之前,以继续匹配下一个交替;而字符类可以按顺序前进。在禁用优化的正则表达式引擎上查看此匹配:

Pattern: (r|f)at 
Match string: carat 

Pattern: [rf]at 
Match string: carat 

<小时 />

但简而言之,事实上 引擎对此进行了优化(单个文字字符 -> 字符类),这已经是一个很好的暗示,表明交替效率低下。


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!