在以下示例中,使用字符类似乎比交替更快:
[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
<小时 />
但简而言之,事实上 pcre引擎对此进行了优化(单个文字字符 -> 字符类),这已经是一个很好的暗示,表明交替效率低下。