2014-02-20 2 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++에서 같은 문제가있었습니다. 정규 표현식 엔진이 정규 표현식 (!)이 포함 된 문자열을 반환하기 때문에 메시지 상자의 문자열이 맞다고 생각합니다. C++에서는 정규식과 정확하게 일치하는 경우에만 (!) 문자열을 반환하도록 엔진에 지시해야했습니다. C++에서 대부분의 엔진은 이것을 수행하기 위해 "exactMatch()"속성이나 함수를 제공합니다. 어쩌면 당신의 VBA 엔진은 비슷한 기능을 제공합니까? – MichaelXanadu

답변

2

사용 ?는 비 욕심 지정 그렇지 않으면 경기는 전체 문자열의 마지막 자리까지 소모합니다. 또한 한 자리 숫자 만 일치시킵니다. 당신이 부정 문자 클래스과 같이 사용하려고 할 수 있습니다, 또는

HQ .*?[0-9]+ 

: 그것은 당신의 목표를 일치 있도록 +는 "하나 이상"을 지정하는 추가

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

또는 당신도 단순화 할 수 있습니다 그 이상 :

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

아, 고마워요! 내가 할 수있을 때 답변으로 표시 할 것입니다. – Jeanno

1

정규식 검색은 기본적으로 욕심이 있습니다. 불행히도 문제를 정확하게 재현하지 못했지만, 긴 문자열이 '. *'와 끝에 번호가 매겨지기 때문에 그럴 것이라고 확신합니다.

HQ .*?[0-9]+ 

즉, "HQ 일치합니다 :

내가 도움이 링크를 찾을 수의 탐욕 *

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

나는 당신의 정규식을 변경 제안에 대해 아래쪽에 explaination를 참조 "및 임의의 수의 문자 다음에 임의의 수의 숫자가옵니다. 또한 "?"때문에 ". *"에서 최소량을 소비합니다.

이것이 작동하지 않으면 Excel에서 정규식을 실행하게됩니다.

+0

답변 해 주셔서 감사합니다. 문제는 문자열이 길다는 것이 맞습니다. – Jeanno