2011-09-28 7 views
8

Używam Access VBA do parsowania ciągu znaków z wyrażeniem regularnym. Oto moja funkcja regex:vba pozytywna antycypacja jest zbyt chciwa

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 

Kiedy przetestować go z:

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

ja spodziewałem się dostać:

153 

ponieważ niewielu znaków między tym i pierwszej instancji "MP" to te w klasie określonej w poprzedniej stronie.

ale mój powrót jest rzeczywista wartość:

153 - MP 13.61 to 

Dlaczego jest przechwytywanie do drugiego „MP”?

Odpowiedz

12

Ponieważ .+ jest chciwy domyślnie. .+ pożera każdy znak, dopóki nie napotka znaku podziału linii lub końca wejścia. Kiedy tak się dzieje, następuje powrót do ostatniego MP (drugiego w twoim przypadku).

To, czego chcesz, to dopasować do użytkownika. Można to zrobić poprzez umieszczenie ? po .+:

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

Że go rozwiązać. – sigil

+0

Dobrze słyszeć ten sigil. –

+0

+1 ładnie wykonane. – brettdj

Powiązane problemy