VB.NET Получить строку между двумя строками — не работает с экранированными символами

#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)