3

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

什么变体对性能更好?

4

2 回答 2

0

什么变体对性能更好?

任何一个。

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

但无论如何,如今的计算机速度很快。我的意思是快。
足够快地运行基于 JSON 或 XML 的应用程序,而 JSON 或 XML 解析需要比简单的正则表达式更多的资源。他们运行良好。所以,我怀疑你会面临这样的正则表达式会影响任何事情的情况

于 2013-05-21T09:10:47.807 回答
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");可能不是类似的,但如果可以的话,请使用它。它的速度始终是其他任何产品的两倍多。

于 2013-05-21T09:11:28.070 回答