Поиск всех вхождений подстроки в строку - Visual Basic .NET
Формулировка задачи:
Здравствуйте, помогите пожалуйста со следующей задачей.
Имеется переменная, в которую загружен достаточно длинный текст. Мне нужно найти все вхождения определенного слова и для каждого вхождения вывести в датагрид строку: пять слов до искомого слова + искомое слово + пять слов после искомого.
Я пытаюсь сделать сам, и вроде даже работает, но уверен что есть лучшее решение.
Вот моя реализация:
К тому же, не могу понять, как поступить если искомое слово находится в начале (и пяти слов до него просто нет) или в конце (когда пяти слов после него тоже нет). Вышеприведенный код будет выдавать ошибку в этих случаях.
Заранее спасибо.
Решение задачи: «Поиск всех вхождений подстроки в строку»
textual
Листинг программы
''' <summary>
''' Поиск слова и окружающего его текста
''' </summary>
''' <param name="text">Текст, в котором выполняется поиск</param>
''' <param name="wordToFind">Слово, которое нужно найти</param>
''' <param name="countBefore">Количество слов перед искомым словом</param>
''' <param name="countAfter">Количество слов после искомого слова</param>
''' <returns>Возвращает список строк. Каждая строка — это искомое слово и заданное количество слов перед ним и после.</returns>
Shared Function FindWord(text As String, wordToFind As String, countBefore As Integer, countAfter As Integer) As List(Of String)
'Список для разбивки текста по регулярному выражению
Dim resultList = New List(Of String)()
'Список, который функция будет возвращать
Dim retval = New List(Of String)
Try
Dim regexObj As New Regex("\S*", RegexOptions.IgnoreCase Or RegexOptions.IgnorePatternWhitespace)
Dim matchResult As Match = regexObj.Match(text)
While matchResult.Success
resultList.Add(matchResult.Value)
matchResult = matchResult.NextMatch()
End While
Catch ex As ArgumentException
'Syntax error in the regular expression
End Try
'Убираем пустые элементы
resultList = resultList.Where(Function(s)
Return s.Length > 0
End Function).ToList()
Dim prevIndex = 0
'В списке слов ищем нужное
While prevIndex >= 0
Dim i = resultList.FindIndex(prevIndex, Function(s)
Return s.ToLower().Contains(wordToFind.ToLower())
End Function)
If i <> -1 Then
Dim startPos, endPos As Integer
If i < countBefore Then
startPos = 0
Else
startPos = i - countBefore
End If
If i > resultList.Count - countAfter + 1 Then
endPos = resultList.Count
Else
endPos = i + countAfter
End If
'Строка записываемая в результирующий списко
Dim value = String.Format("{0} {1} {2}", String.Join(" "c, resultList.Skip(startPos).Take(i - startPos)),
resultList(i),
String.Join(" "c, resultList.Skip(i + 1).Take(endPos - i))
)
retval.Add(value)
Else
Exit While
End If
prevIndex = i + 1
End While
Return retval
End Function