Редактирование кода регулярных выражений

#regex

#регулярное выражение

Вопрос:

Я надеюсь, что кто-нибудь может помочь мне с тем, что я считаю проблемой регулярных выражений.

У меня есть программа, которая берет фрагмент HTML-кода, извлекает из него телефонные номера и разделяет их точкой с запятой. Что я хотел бы сделать, так это изменить это так, чтобы оно извлекало что-либо между двумя конкретными текстовыми строками с обратными косыми чертами между ними. Например

 stringone/******/stringtwo
stringone/876876876876876/stringtwo
stringone/abcdefghijklmnopqrstuvwxyz/stringtwo
  

Перед и после общей строки могут быть или не быть пробелы, буквы, цифры или специальные символы.

Я действительно пробовал использовать регулярные выражения, но не могу разобраться в этом. Я предполагаю (и только инстинктивно), что строка, которая нуждается в изменении, — это эта:

     .Pattern = "( ([d ()-] ){10,15})|((d( |-))?(?d{2,4})?( |-)d{3,4}( |-)d{3,4})|(d{3,4}( |-)d{7})"
  

Но весь код выглядит следующим образом:

 Function Main ( strText )

    dim strResult

    strResult = Extract_Phone_Numbers ( strText )

    Main = strResult

End Function

' This function extracts phone numbers from a specific string using pattern matching (a regular expression).

Function Extract_Phone_Numbers ( strText )

    dim strResult

    Set RegularExpressionObject = New RegExp

    With RegularExpressionObject
    .Pattern = "( ([d ()-] ){10,15})|((d( |-))?(?d{2,4})?( |-)d{3,4}( |-)d{3,4})|(d{3,4}( |-)d{7})"
    .IgnoreCase = True
    .Global = True
    End With

    Set objMatches = RegularExpressionObject.Execute( strText )

    For Each objMatch in objMatches
        If ( InStr ( strResult, objMatch.value ) = 0  )  Then
            If ( Len ( strResult ) > 0  )  Then
                strResult = strResult   "; "
            End If      
            strResult = strResult   objMatch.value
        End If      
    Next

    Set RegularExpressionObject = nothing

    strResult = Trim ( strResult )

    Extract_Phone_Numbers = strResult

End Function
  

Кто-нибудь может помочь мне изменить это?

Комментарии:

1. Извините, не могли бы вы подтвердить, на каком языке мы смотрим?

2. @zx81 Я знаю, это звучит безумно, но на самом деле я не знаю. Я пытаюсь что-то изменить, а не создавать с нуля. При этом я «думаю», что это VBScript.

3. Это фантастика! lol =) Эй, смотрите мой ответ, вы сопоставляете несколько строк в одном файле или извлекаете строки по одной за раз?

Ответ №1:

  1. В общем, шаблон для сопоставления с вашим шаблоном stringone/[^/]*/stringtwo , включая косые черты
  2. Для сопоставления внутри, но без учета косых черт, есть несколько способов. Если ваш вариант поддерживает поисковые решения, используйте это: (?<=stringone/)[^/]*(?=/stringtwo)
  3. VBS не поддерживает lookbehind, поэтому нам нужно сопоставить всю строку, записав нужную часть в группу 1: stringone/([^/]*)/stringtwo

На демонстрации посмотрите на снимки группы 1 на правой панели. Обратите внимание, что в этом тестере регулярных выражений косые черты должны были быть экранированы.

Объяснение

stringone/ соответствует литералу stringone/ , затем отрицаемый символьный класс [^/] соответствует одному символу, который не является a / , и * квантификатор повторяет это 0 или более раз, затем мы сопоставляем финал /stringtwo .

Комментарии:

1. Привет, zx81. На странице будет несколько экземпляров, которые, я надеюсь, будут разделены на выходе полуколонками. Это также должно быть между конкретными словами «stringone /» и «/ stringtwo».

2. К ВАШЕМУ сведению, исправлен ответ, добавлена демонстрация. 🙂

3. Я знаю, что я настаиваю на этом, но где этот код соотносится с исходным кодом? Я попытался заменить весь код, но он не работает.

4. Извините, не могу помочь с этим кодом, только регулярное выражение (см. Демонстрационные снимки на правой панели ). 🙁 Шаблон stringone/([^/]*)/stringtwo заменит вашу .Pattern = строку… Не уверен в точном синтаксисе для извлечения группы 1. Надеюсь, кто-нибудь придет на помощь. 🙂

5. Я забыл изменить «stringone» и «stringtwo» на мои строки :). это работает отлично. Большое спасибо за вашу помощь.