2017-05-29 109 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,}'可能會也可能不會找到任何要替換的東西,所以它不會對性能造成太大的傷害,因爲大部分時間比較而不是替代將成爲主要因素。 –