繁体   English   中英

关于正则表达式执行

[英]About regexp performancing

给定字符串ab

鉴于这种正则表达式模式

(a)(b)

如果我们需要删除完整的字符串,但打印第二组,我们可以编写2个变体:

1) preg_replace("#(a)(b)#", "$2", "ab") // save both group

还有:

2) preg_replace("#(?:a)(b)#", "$1", "ab") // dont save first group

哪种变体更适合性能?

哪种变体更适合性能?

无论是。

如果你只需要做几次替换,那就没关系了。 如果您必须进行数百万次替换,则必须考虑源数据的另一种格式,这将需要较少的解析。

但无论如何,现在电脑很快。 我的意思是快。
足够快以运行基于JSON或XML的应用程序,而JSON或XML解析需要比简单的正则表达式更多的资源。 他们运行良好。 所以,我怀疑你会遇到这样一个状态,这样的正则表达式会影响任何事情

我以紧凑的循环运行每个操作5,000,000,并比较时间。 我实际比较了四个操作:

preg_replace("#(a)(b)#", "$2", "ab");
preg_replace("#(?:a)(b)#", "$2", "ab");
preg_replace("#a(b)#", "$2", "ab");
preg_replace("#a(?=b)#", "", "ab");

我没有看到时间上的非常一致的差异,所以我认为它实际上对性能无关紧要,即我会从设计/语义角度选择最合理的。

#1和#2表现差不多。 #2似乎稍快,但偶尔会慢一点(可能是由于服务器噪音)。 #3始终比这快5%左右,选项#4比#3快2%左右(即它似乎是最好的,可能是因为它不必捕获或插入任何东西)。

不过,我只是选择最有意义的东西。

我意识到str_replace("ab", "b", "ab"); 可能不是类似的,但如果可以,请使用它。 它的速度始终是其他任何速度的两倍多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM