首页 > 解决方案 > 删除部分 StringBuilder 的有效方法

问题描述

我有一个正则表达式,它在 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.000.000 次迭代分别需要 101、45、34 秒。

我的问题是为什么第一个解决方案这么慢?是否可以优化此代码?

标签: vb.netstringbuilder

解决方案


推荐阅读