2014-02-20 5 views
1

Я пытаюсь выполнить поиск регулярного выражения в строке, назначенной содержимому HTML-поиска в Интернете. Образец, который я пытаюсь сопоставить, имеет следующий формат: HQ 12345, второй фрагмент также может начинаться с буквы, так что HQ A12345 также является возможностью. Как показано в приведенном ниже коде, шаблон регулярного выражения, который я использую, равен "HQ .*[0-9]".Регулярный шаблон выражения Соответствие HTML-контенту

Проблема в том, что я запускаю поиск в регулярном выражении, который соответствует шаблону, а не только HQ 959693, но также включает в себя остальную часть содержимого файла html, как показано в снимок окна сообщения ниже. RegEx Pattern Matched

Sub Test() 
    Dim mystring As String 
    mystring = getHTMLData("loratadine") 
    Dim rx As New RegExp 
    rx.IgnoreCase = True 
    rx.MultiLine = False 
    rx.Global = True 
    rx.Pattern = "HQ .*[0-9]" 
    Dim mtch As Variant 
    For Each mtch In rx.Execute(mystring) 
     Debug.Print mtch 
     MsgBox(mtch) 
    Next 
End Sub 

Public Function getHTMLData (ByVal name As String) As String 
    Dim XMLhttp: Set XMLhttp = CreateObject("MSXML2.ServerXMLHTTP") 
    XMLhttp.setTimeouts 2000, 2000, 2000, 2000 
    XMLhttp.Open "GET", "http://rulings.cbp.gov/results.asp?qu=" & name & "&p=1", False 
    XMLhttp.send 

    If XMLhttp.Status = 200 Then 
     getHTMLData = XMLhttp.responsetext 
    Else 
     getHTMLData = "" 
    End If 
End Function 
+0

Я не знаком с VBA, но имел ту же проблему в C++. Я думаю, что строка в поле сообщения правильная, потому что ваш механизм regex возвращает любую строку, которая содержит (!) Ваше регулярное выражение. В C++ я должен был заставить движок возвращать строку только в том случае, если она точно соответствует (!) Правильному выражению. В C++ большинство движков предоставляют свойство или функцию «exactMatch()» для этого. Может быть, ваш VBA-двигатель обеспечивает аналогичную функциональность? – MichaelXanadu

ответ

2

Используйте ? указать нежадным, в противном случае матч не будет потреблять до последней цифры всей строки. Кроме того, вы соответствуете только одному значению. Добавить + указать «один или более», поэтому он будет соответствовать своей цели:

HQ .*?[0-9]+ 

В качестве альтернативы, вы можете попробовать использовать инвертированный символьный класс следующим образом:

HQ [^0-9]*[0-9]+ 

Или вы даже можете упростить далее:

HQ [^\d]*\d+ 
+0

Ах, спасибо! я буду отмечать как ответ, когда смогу – Jeanno

1

Соответствие Regex по умолчанию жадный. К сожалению, я не смог точно воспроизвести вашу проблему, но я уверен, что это потому, что вы длинная строка, которая под номером «. *» Совпадает с номером в конце.

Я нахожу эту ссылку полезной, увидеть объяснения вблизи дна о жадности *

http://www.autohotkey.com/docs/misc/RegEx-QuickRef.htm

Я предлагаю меняющегося свой Regex чтобы:

HQ .*?[0-9]+ 

Это будет соответствовать «HQ "и любое количество символов, за которыми следует любое число числовых символов. Он также будет потреблять минимальное количество в «. *» Из-за «?».

Пожалуйста, ответьте, если это не сработает, и я заработаю Regex в Excel.

+0

Спасибо за ваш ответ. Вы абсолютно правы, проблема в том, что строка длинна. – Jeanno

Смежные вопросы