关于正则表达式执行

时间:2013-05-21 08:49:45

标签: regex

给定字符串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

哪种变体对性能更好?

2 个答案:

答案 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");可能并不相似,但如果可以,请使用它。它的速度始终是其他任何速度的两倍。