Поиск всех вхождений подстроки в строку - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д