#regex #vb.net
#регулярное выражение #vb.net
Вопрос:
Я пытаюсь найти строку между двумя другими строками. Эта функция работает нормально, но как только я использую экранированные символы («»), она перестает работать и возникает ошибка времени выполнения. Функция и рабочие / нерабочие примеры ниже:
Функция:
Public Function GetBetween(ByVal haystack As String, ByVal needle As String, ByVal needle_two As String) As String
Dim istart As Integer = InStr(haystack, needle)
If istart > 0 Then
Dim istop As Integer = InStr(istart, haystack, needle_two)
If istop > 0 Then
Dim value As String = haystack.Substring(istart Len(needle) - 1, istop - istart - Len(needle))
Return value
End If
End If
Return Nothing
End Function
Пример работы:
Dim Haystack As String = "hello find me world"
Dim FindIt As String = GetBetween(Haystack, "hello", "world")
MessageBox.Show(FindIt)
Пример нерабочий (с использованием экранированных символов «»»):
Dim Haystack As String = "<input type=""hidden"" name=""testsubmit"" id=""testsubmit"" value=""findme"" />"
Dim FindIt As String = GetBetween(Haystack, "id=""testsubmit"" value=""", """")
MessageBox.Show(FindIt)
Ошибка:
Исключение ArgumentOutOfRangeException не было обработано
Длина не может быть меньше нуля.
Имя параметра: длина
Таким образом, в основном моя функция не позволяет мне использовать ее при поиске экранированных символов.
Комментарии:
1. На вашем месте я бы предположил, что что-то еще сломалось. После компиляции вашей программы невозможно определить, как была написана строка. Экранирование имеет значение только для компилятора, поэтому вы не можете написать алгоритм, который функционирует по-разному в зависимости от того, как вы задаете строки.
2. Даже жесткое кодирование строк в VB перед компиляцией, например, в примере в моем вступительном Q, не будет работать корректно, поэтому я открыл вопрос. Проблема может быть только в предоставленном коде, поскольку это все, что используется.
Ответ №1:
Вы можете легко определить, что проблема не имеет ничего общего с экранированными кавычками, заменив их в вашей строке каким-либо другим символом и увидев, что вызов функции завершается с ошибкой точно так же.
Реальная разница между вашими двумя тестовыми строками заключается в том, что в вашем первом примере ваша needle_two
строка не отображается в вашей needle
строке, в то время как во втором примере она появляется. Другими словами, ваша проблема в том, что вы начинаете искать needle_two
, где needle
начинается, а не где заканчивается, и istop
заканчивается внутри needle
.
Что вам нужно сделать, это начать поиск после needle
остановок:
Dim istop As Integer = InStr(istart Len(needle), haystack, needle_two)