我有一个包含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行条件转换成一条简单的正则表达式就好了。
答案 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快,但不够灵活。如果字符串有任何改变的可能性,那么这个字符串会受到可维护性问题的困扰,而他的情况则不然。