2016-12-29 52 views
2

我需要做字符串替換...我需要處理的只有少數病例:任何改善Regex.Replace性能的方法?

1) optional case insensitive 
2) optional whole words 

現在,我使用_myRegEx.Replace()...如果指定了#1,我添加RegexOptions.IgnoreCase標誌。如果指定了#2,則將搜索詞包裝在\ b <字> \ b中。

這工作正常,但它真的很慢。我的基準測試需要1100ms,而使用String.Replace測試需要90ms。顯然,一些問題這樣做:

1) case insensitive is tricky 
2) regex \b<word>\b will handle "<word>", " <word>", "<word> " and " <word> "... string replace would only handle " <word> ". 

我已經使用了RegexOptions.Compiled標誌。

還有其他的選擇嗎?

+0

@ M.kazemAkhgary,我沒有使用靜態,我正在使用實例...我已更新帖子以澄清。 – SledgeHammer

+1

你如何實例化'Regex'實例?有一些正則表達式模式,因爲它是已知的緩慢[像這樣](http://stackoverflow.com/questions/9687596/slow-regex-performance),甚至微軟給出了[使用正則表達式的最佳實踐](https:/ /msdn.microsoft.com/en-us/library/gg578045(v=vs.110).aspx)。 –

+0

@BagusTesa只是像新的正則表達式(「\ bTest \ b」,RegexOptions.Compiled | RegexOptions.IgnoreCase);對於案例1和2. – SledgeHammer

回答

2

如果您的不是使用已編譯的正則表達式,則可以在此情況下獲得顯着的改進。老實說,這並不是我第一次測量正則表達式,並發現編譯後的正則表達式更慢,即使按照它應該使用的方式使用。

讓我們在一個字符串12345替換\bfast\b一萬次,使用四種不同的方法,和時間多久,這花 - 在兩個不同的電腦:

var str = "Regex.Replace is extremely FAST for simple replacements like that"; 
var compiled = new Regex(@"\bfast\b", RegexOptions.IgnoreCase | RegexOptions.Compiled); 
var interpreted = new Regex(@"\bfast\b", RegexOptions.IgnoreCase); 
var start = DateTime.UtcNow; 
for (int i = 0; i < 1000000; i++) 
{ 
    // Comment out all but one of these: 
    str.Replace("FAST", "12345"); // PC#1: 208 ms, PC#2: 339 ms 
    compiled.Replace(str, "12345"); // 1100 ms, 2708 ms 
    interpreted.Replace(str, "12345"); // 788 ms, 2174 ms 
    Regex.Replace(str, @"\bfast\b", "12345", RegexOptions.IgnoreCase); // 1076 ms, 3138 ms 
} 
Console.WriteLine((DateTime.UtcNow - start).TotalMilliseconds); 

編譯的正則表達式是一貫最慢的一個。和string.ReplaceRegex.Replace之間的差別並不大,但是它在同一個球場。所以嘗試一下,不要編譯正則表達式。

另外值得注意的是,如果你只有一個巨大的字符串,Regex.Replace的速度非常快,在我的電腦上爲13,000行Pride and Prejudice花費了大約7ms的時間。

+0

我沒有在「BAT」(大的$$文本)上做過一次。我正在一行文字上反覆做這件事。例如,取第一句你的答覆,並做一個完整的單詞替換爲「那個」1M次迭代(顯然在我的情況下,它的不同單行,我只是給你一個例子)。我不能將線條拼湊在一起。他們需要一次完成一個。 – SledgeHammer

+0

@SledgeHammer回答更新。嘗試它而不編譯正則表達式。儘管如此,在我的例子中,正則表達式大約比字符串慢4倍-7倍。替換,你可能不會做太多的事情。 –

+0

哇......那很奇怪!編譯正則表達式應該會更快。也許它只是爲了更復雜的正則表達式(或者如果你使用正則表達式字符?)??但是,我看到了和你一樣的結果...編譯= 370ms,非編譯= 205ms。 – SledgeHammer