Эффективный способ удалить части StringBuilder - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть регулярное выражение, которое ищет некоторые шаблоны в строителе строк:

Dim sb as New StringBuilder(10000) 'some long string builder, filled with text
Dim matches As MatchCollection = myRegex.Matches(sb.ToString())

Далее, мне нужно удалить все совпадения из строителя строк и вернуть только начало строителя строк, где есть только возможный текст, который не совпадает. Я знаю несколько способов сделать это.

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 секунды соответственно.

Мой вопрос: почему первое решение такое медленное? И можно ли оптимизировать этот код?

...