2016-12-29 85 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