Regex.Replace比使用String.Contains的条件语句慢得多

时间:2009-09-15 00:33:55

标签: c# regex string replace

我有一个包含400个字符串的列表,所有字符串都以“_GONOGO”或“_ALLOC”结尾。当应用程序启动时,我需要从每个字符串中删除“_GONOGO”或“_ALLOC”。

我试过这个: 'string blah = Regex.Replace(string,“(_ GONOGO | _ALLOC)”,“”));'

但它比这样的简单条件语句慢得多:

if (string.Contains("_GONOGO"))
          // use Substring
else if (string.Contains("_ALLOC"))
          // use Substring w/different index

我是正则表达式的新手,所以我希望有人有更好的解决方案,或者我正在做一些可怕的错误。这不是什么大不了的事,但将这条4行条件转换成一条简单的正则表达式就好了。

5 个答案:

答案 0 :(得分:8)

虽然它不是RegEx,但你可以做到

string blah = string.Replace("_GONOGO", "").Replace("_ALLOC", "");

RegEx非常适合复杂的表达式,但对于像这样的非常简单的操作,开销有时会过度。

答案 1 :(得分:4)

如果先编译正则表达式,正则表达式替换可能会更快。如:

Regex exp = new Regex(
    @"(_GONOGO|_ALLOC)",
    RegexOptions.Compiled);

exp.Replace(string, String.Empty);

答案 2 :(得分:3)

这是预期的;通常,手动操作字符串比使用正则表达式更快。使用正则表达式涉及将表达式编译为正则表达式树,这需要时间。

如果你在多个地方使用这个正则表达式,你可以使用RegexOptions.Compiled标志来减少每个匹配的开销,正如David在他的回答中所描述的那样。其他正则表达式专家可能有改进表达的提示。不过,你可能会考虑坚持使用String.Replace;它快速可读。

答案 3 :(得分:1)

如果它们都以其中一种模式结束,那么完全放弃替换并使用它可能会更快:

string result = source.Substring(0, source.LastIndexOf('_'));

答案 4 :(得分:1)

如果您有关于问题域的大量信息,可以使事情变得非常简单:

const int AllocLength = 6;
const int GonogoLength = 7;
string s = ...;
if (s[s.Length - 1] == 'C')
    s = s.Substring(0, s.Length - AllocLength);
else
    s = s.Substring(0, s.Length - GonogoLength);

这在理论上比Abraham's solution快,但不够灵活。如果字符串有任何改变的可能性,那么这个字符串会受到可维护性问题的困扰,而他的情况则不然。