Поиск всех вхождений подстроки в строку - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, помогите пожалуйста со следующей задачей. Имеется переменная, в которую загружен достаточно длинный текст. Мне нужно найти все вхождения определенного слова и для каждого вхождения вывести в датагрид строку: пять слов до искомого слова + искомое слово + пять слов после искомого. Я пытаюсь сделать сам, и вроде даже работает, но уверен что есть лучшее решение. Вот моя реализация:
Листинг программы
  1. 'весь текст хранится в PlainText и разбивается по признаку пробела в AllText()
  2. Dim PlaunText as String
  3. Dim AllText() As String
  4. Dim foundData As String
  5. 'Что ищем
  6. Dim SearchFor as String
  7. AllText = PlainText.Replace(vbCr, " ").Replace(vbCrLf, " ").Split(" ")
  8. 'поиск по всем элементам массива
  9. For i = 0 To UBound(AllText) - 1
  10. 'Перевод всего текста в прописные для сравнения и сравниваем со StartWith чтобы избежать влияния окончаний
  11. If AllText(i).ToUpper.StartsWith(SearchFor.ToUpper) Then
  12. 'Если искомое встретилось, берем пять элементов до и после вхождения
  13. For k = -5 To 5
  14. foundData &= " " & AllText(i + k).ToString
  15. Next
  16. dgvMain.Rows.Add()
  17. dgvMain.Rows(kk).Cells(1).Value = wFile
  18. dgvMain.Rows(kk).Cells(2).Value = foundData
  19. kk += 1
  20. foundData = ""
  21. End If
  22. Next
К тому же, не могу понять, как поступить если искомое слово находится в начале (и пяти слов до него просто нет) или в конце (когда пяти слов после него тоже нет). Вышеприведенный код будет выдавать ошибку в этих случаях. Заранее спасибо.

Решение задачи: «Поиск всех вхождений подстроки в строку»

textual
Листинг программы
  1. ''' <summary>
  2. ''' Поиск слова и окружающего его текста
  3. ''' </summary>
  4. ''' <param name="text">Текст, в котором выполняется поиск</param>
  5. ''' <param name="wordToFind">Слово, которое нужно найти</param>
  6. ''' <param name="countBefore">Количество слов перед искомым словом</param>
  7. ''' <param name="countAfter">Количество слов после искомого слова</param>
  8. ''' <returns>Возвращает список строк. Каждая строка это искомое слово и заданное количество слов перед ним и после.</returns>
  9. Shared Function FindWord(text As String, wordToFind As String, countBefore As Integer, countAfter As Integer) As List(Of String)
  10.     'Список для разбивки текста по регулярному выражению
  11.     Dim resultList = New List(Of String)()
  12.     'Список, который функция будет возвращать
  13.     Dim retval = New List(Of String)
  14.     Try
  15.         Dim regexObj As New Regex("\S*", RegexOptions.IgnoreCase Or RegexOptions.IgnorePatternWhitespace)
  16.         Dim matchResult As Match = regexObj.Match(text)
  17.         While matchResult.Success
  18.             resultList.Add(matchResult.Value)
  19.             matchResult = matchResult.NextMatch()
  20.         End While
  21.     Catch ex As ArgumentException
  22.         'Syntax error in the regular expression
  23.     End Try
  24.     'Убираем пустые элементы
  25.     resultList = resultList.Where(Function(s)
  26.                                         Return s.Length > 0
  27.                                     End Function).ToList()
  28.     Dim prevIndex = 0
  29.     'В списке слов ищем нужное
  30.     While prevIndex >= 0
  31.         Dim i = resultList.FindIndex(prevIndex, Function(s)
  32.                                                     Return s.ToLower().Contains(wordToFind.ToLower())
  33.                                                 End Function)
  34.         If i <> -1 Then
  35.             Dim startPos, endPos As Integer
  36.  
  37.             If i < countBefore Then
  38.                 startPos = 0
  39.             Else
  40.                 startPos = i - countBefore
  41.             End If
  42.             If i > resultList.Count - countAfter + 1 Then
  43.                 endPos = resultList.Count
  44.             Else
  45.                 endPos = i + countAfter
  46.             End If
  47.             'Строка записываемая в результирующий списко
  48.             Dim value = String.Format("{0} {1} {2}", String.Join(" "c, resultList.Skip(startPos).Take(i - startPos)),
  49.                                                     resultList(i),
  50.                                                     String.Join(" "c, resultList.Skip(i + 1).Take(endPos - i))
  51.                                     )
  52.             retval.Add(value)
  53.         Else
  54.  
  55.             Exit While
  56.         End If
  57.         prevIndex = i + 1
  58.     End While
  59.     Return retval
  60. End Function

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.538 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут