Поиск всех вхождений подстроки в строку - 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

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


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

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

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