#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:
- В общем, шаблон для сопоставления с вашим шаблоном
stringone/[^/]*/stringtwo
, включая косые черты - Для сопоставления внутри, но без учета косых черт, есть несколько способов. Если ваш вариант поддерживает поисковые решения, используйте это:
(?<=stringone/)[^/]*(?=/stringtwo)
- 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» на мои строки :). это работает отлично. Большое спасибо за вашу помощь.