2011-09-28 14 views
8

Estoy usando Access VBA para analizar una cadena con expresiones regulares. Aquí está mi función de expresiones regulares:vba lookahead positivo es demasiado codicioso

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 

Cuando la prueba con:

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

Estoy esperando para obtener:

153 

porque los únicos caracteres entre esto y la primera instancia de 'MP' son los de la clase especificada en la búsqueda anticipada.

pero mi valor de retorno real es:

153 - MP 13.61 to 

¿Por qué es capturar hasta el segundo 'MP'?

Respuesta

12

Porque .+ es codicioso por defecto. El .+ devora todos los caracteres hasta que encuentra un carácter de corte de línea o el final de la entrada. Cuando eso sucede, retrocede al último MP (el segundo en su caso).

Lo que quiere es hacer coincidir ungreedy. Esto se puede hacer mediante la colocación de un ? después .+:

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

Eso lo resolvió. – sigil

+0

Es bueno escuchar ese sigilo. –

+0

+1 muy bien hecho. – brettdj