2017-05-29 108 views
0

我在我的go项目中发现regexp替换速度非常慢,\ s +被regexp.ReplaceAllLiteralString(re2)替换为单个空间。正则表达式一个或多个vs n + 1匹配

很显然,这是为了让SVG中的空白崩溃,无论这是个好主意,当改为“{2,}”时,操作只有十分之一。

虽然使用\ s vs''是一个公平的差异 - 但这是有道理的,它是5倍的比较。但为什么当使用单个空间和+时,它比{2,}慢9倍?

回答

0

X+表示“发生一次或多次X的每个实例”,这意味着它相当于{1,}。当使用\s+时,您将替换(单个空白)以及     

对于SVG文档或任何XML文档,使用\s+肯定会很慢。下列文件将需要5个替换,忽略换行符序列:

<?xml version="1.0" encoding="utf-8"?> 
<element attr1="value" attr2="value" attr3="value"/> 

现在想象一下,一个SVG文件,这么多复杂,这是合理的东西像\s{2,}将是一个很大的速度比\s+(又名\s{1,})!如果您使用\s{2,},则上面的文档中会有0个替换!

+0

这是否意味着替换比比较成本更高? \ s {2,}的比较似乎比\ s {1,}更昂贵 - 除非它们根据模式消耗2个字节/符文而不是1个。 – jpj

+0

@jpj这取决于您要替换的文本。在XML的情况下,'\ s {1,}'几乎总会找到并替换一些东西,可能会导致性能下降。 '\ s {2,}'可能会也可能不会找到任何要替换的东西,所以它不会对性能造成太大的伤害,因为大部分时间比较而不是替代将成为主要因素。 –