【发布时间】:2014-03-28 15:13:52
【问题描述】:
一些背景
我通常使用网站http://regex101.com 来测试我的正则表达式,它在PCRE 中提供了一个“调试器”功能,可以让您逐步了解正则表达式引擎在做什么。
当用.* 匹配一个随机字符串时,这个调试器告诉我引擎遵循3 steps 的常数。
当与(?:.)* 匹配时,它会根据长度宣布一个数字:66 steps 表示类似0123456789012345678901234567899。
(?:.)* 真的比.* 贵吗?
似乎在后一种情况下,每次进入组都被认为是一个新的步骤,而在前一种情况下,.* 是一次应用的。
这是网站正在做的某种“改进”(试图避免显示无用的情况),还是与真正的内部正则表达式机制相匹配?如果是这样,幕后的想法是什么?
【问题讨论】:
-
我不知道性能。这将特定于实施。但是
(?:.)*并没有比.*提供任何好处,但它确实使你的语法更长。 -
这个问题带有微优化的味道。虽然从纯粹的学术角度来看这很有趣,但我真诚地希望你不要假设(无论如何没有非常坚实的基础)这两种构造之间微小但可测量的差异将以任何方式提供切实的好处给你。
-
+1 到@Vector Gorgoth。在优化正则表达式模式时,您希望通过减少回溯的可能性来做到这一点,使其尽可能接近于零。这样您才能获得真正的性能提升。