У меня есть регулярное выражение, которое ищет некоторые шаблоны в строителе строк:
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 секунды соответственно.
Мой вопрос: почему первое решение такое медленное? И можно ли оптимизировать этот код?