【发布时间】:2014-04-03 15:45:03
【问题描述】:
在如下示例中,使用字符类似乎比交替使用更快:[abc] vs (a|b|c)
我听说有人推荐它,并使用 Time::HiRes 进行了简单测试,我验证了它(慢了约 10 倍)。
同样使用 (?:a|b|c) 以防捕获括号产生影响并不会改变结果。
但我不明白为什么。我认为这是因为回溯,但我在每个位置看到它的方式有 3 个字符比较,所以我不确定回溯如何影响交替。是因为执行的交替性质造成的吗?
【问题讨论】:
-
想想引擎的逻辑 - 在第一种情况下,您告诉引擎您正在寻找 3 个字符中的一个。引擎可以优化。在第二种情况下,引擎必须检查第一个,失败,回溯,检查第二个,失败,回溯,最后检查最后一个选项。
-
我已经运行了一些测试并使用
pcretest提取了一些调试信息。这是the results。很有趣的是,PCRE 以某种方式将[abc]改进为[a-c],并且在使用捕获组时似乎有更多的“步骤”。 -
@BoristheSpider:我不确定这种差异。如果我们要查找 3 个字符中的 1 个,我们仍然需要测试 3 次。每个字符一个对吗?
-
为什么要使用 linux 和 perl 标签?你只对 perl 解析正则表达式的方式感兴趣吗?我不知道任何作为 Linux 内核一部分的正则表达式解析。
标签: regex performance perl character-class regex-alternation