给定字符串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
什么变体对性能更好?
给定字符串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");
可能不是类似的,但如果可以的话,请使用它。它的速度始终是其他任何产品的两倍多。