给定字符串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
哪种变体对性能更好?
答案 0 :(得分:0)
哪种变体对性能更好?
要么。
如果你只需做很少的替换,那就没关系了。 如果您需要进行数百万次替换,则必须考虑源数据的另一种格式,这将需要较少的解析。
但无论如何,现在计算机很快。我的意思是快 足够快以运行基于JSON或XML的应用程序,而JSON或XML解析需要比简单的正则表达式更多的资源。他们运行良好。所以,我怀疑你会遇到这样一个条件,这样的正则表达式会影响任何东西
答案 1 :(得分:0)
我以紧凑的循环运行每个操作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");
可能并不相似,但如果可以,请使用它。它的速度始终是其他任何速度的两倍。