2011-09-28 24 views
8

Tôi đang sử dụng truy cập VBA để phân tích một chuỗi với regex. Đây là chức năng regex của tôi:vba tích cực lookahead là quá tham lam

Function regexSearch(pattern As String, source As String) As String 

Dim re As RegExp 
Dim matches As MatchCollection 
Dim match As match 


Set re = New RegExp 
re.IgnoreCase = True 

re.pattern = pattern 
Set matches = re.Execute(source) 


    If matches.Count > 0 Then 
     regexSearch = matches(0).Value 
    Else 
     regexSearch = "" 
    End If 


End Function 

Khi tôi thử nghiệm nó với:

regexSearch("^.+(?=[ _-]+mp)", "153 - MP 13.61 to MP 17.65") 

Tôi đang chờ đợi để có được:

153 

vì các nhân vật duy nhất giữa này và trường hợp đầu tiên của 'MP' là những người trong lớp được chỉ định trong lookahead.

nhưng giá trị trả thực tế của tôi là:

153 - MP 13.61 to 

Tại sao nó chụp cho đến thứ hai 'MP'?

Trả lời

12

Bởi vì .+ tham lam theo mặc định. Các .+ gobbles lên mỗi nhân vật cho đến khi nó gặp một char phá vỡ dòng, hoặc cuối-of-đầu vào. Khi điều đó xảy ra, nó sẽ trở lại phiên bản MP cuối cùng (trường hợp thứ hai trong trường hợp của bạn).

Điều bạn muốn khớp với không phù hợp. Điều này có thể được thực hiện bằng cách đặt một số ? sau .+:

regexSearch("^.+?(?=[ _-]+MP)", "153 - MP 13.61 to MP 17.65") 
+0

Điều đó giải quyết được. – sigil

+0

Rất tốt khi nghe tiếng sigil đó. –

+0

+1 được thực hiện tốt. – brettdj

Các vấn đề liên quan