Поиск всех вхождений подстроки в строку - Visual Basic .NET
Формулировка задачи:
Здравствуйте, помогите пожалуйста со следующей задачей.
Имеется переменная, в которую загружен достаточно длинный текст. Мне нужно найти все вхождения определенного слова и для каждого вхождения вывести в датагрид строку: пять слов до искомого слова + искомое слово + пять слов после искомого.
Я пытаюсь сделать сам, и вроде даже работает, но уверен что есть лучшее решение.
Вот моя реализация:
К тому же, не могу понять, как поступить если искомое слово находится в начале (и пяти слов до него просто нет) или в конце (когда пяти слов после него тоже нет). Вышеприведенный код будет выдавать ошибку в этих случаях.
Заранее спасибо.
Листинг программы
- 'весь текст хранится в PlainText и разбивается по признаку пробела в AllText()
- Dim PlaunText as String
- Dim AllText() As String
- Dim foundData As String
- 'Что ищем
- Dim SearchFor as String
- AllText = PlainText.Replace(vbCr, " ").Replace(vbCrLf, " ").Split(" ")
- 'поиск по всем элементам массива
- For i = 0 To UBound(AllText) - 1
- 'Перевод всего текста в прописные для сравнения и сравниваем со StartWith чтобы избежать влияния окончаний
- If AllText(i).ToUpper.StartsWith(SearchFor.ToUpper) Then
- 'Если искомое встретилось, берем пять элементов до и после вхождения
- For k = -5 To 5
- foundData &= " " & AllText(i + k).ToString
- Next
- dgvMain.Rows.Add()
- dgvMain.Rows(kk).Cells(1).Value = wFile
- dgvMain.Rows(kk).Cells(2).Value = foundData
- kk += 1
- foundData = ""
- End If
- Next
Решение задачи: «Поиск всех вхождений подстроки в строку»
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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д