我有一个正则表达式,它在stringbuilder中搜索一些模式:
Dim sb as New StringBuilder(10000) 'some long string builder, filled with text
Dim matches As MatchCollection = myRegex.Matches(sb.ToString())
此外,我需要从stringbuilder中删除所有匹配项,并仅返回stringbuilder的开始,其中只有可能的文本不匹配。我知道几种方法。
1)一次删除所有其余部分:
Dim lenToRemove As Integer = sb.Length - matches(0).Index
sb = sb.Remove(matches(0).Index, lenToRemove)
2)循环中用空字符串替换每个部分:
For Each m As Match In matches
sb = sb.Replace(m.Value, String.Empty)
Next
3)循环地向后拆卸每个零件:
For i As Integer = matches.Count - 1 To 0 Step -1
sb = sb.Remove(matches(i).Index, matches(i).Length)
Next
sb = sb.Remove(0, matches(0).Index)
此代码是数百万次迭代的某些处理的一部分。前两种方法的工作速度明显慢于第三种方法。例如,4.0000.000次迭代分别需要101、45、34秒。
我的问题是为什么第一个解决方案这么慢?可以优化此代码吗?