2011-11-28 23 views
7

¿Cómo puedo obtener la posición del primer resultado coincidente en una expresión regular? Vea abajo.Excel VBA Regex Match Position

Function MYMATCH(strValue As String, strPattern As String, Optional blnCase As Boolean = True, Optional blnBoolean = True) As String 
    Dim objRegEx As Object 
    Dim strPosition As Integer 

    ' Create regular expression. 
    Set objRegEx = CreateObject("VBScript.RegExp") 
    objRegEx.Pattern = strPattern 
    objRegEx.IgnoreCase = blnCase 

    ' Do the search match. 
    strPosition = objRegEx.Match(strValue) 

    MYMATCH = strPosition 
End Function 

Por un lado, no estoy del todo seguro de lo que está regresando .Match (cadena, entero, etc.). La única solución que encontré dijo que debería crear un objeto Match y luego tomar la posición desde allí, pero a diferencia de , no reconoce el objeto Match. También he visto some code como la siguiente, pero no estoy buscando necesariamente el valor, sólo la primera colocación cadena:

If allMatches.count <> 0 Then 
    result = allMatches.Item(0).submatches.Item(0) 
End If 

ignorando Algo cualquiera de los posibles errores de sintaxis anteriores (sobre todo debido a mi cambio de variables tipos derecha e izquierda), ¿cómo puedo lograrlo fácilmente?

Gracias!

+0

Tiene razón, es mi culpa (se me olvidó que ayuda a la reputación de todos) en este sitio) ... además de eso, me di cuenta por mi cuenta ... otra vez. – Jonathan

+0

Sin embargo, publicaré mi respuesta en 8 horas para el beneficio de cualquier otra persona que se encuentre con este problema. – Jonathan

+1

¿Por qué 8 horas y no ahora? – JimmyPena

Respuesta

12

Puede utilizar FirstIndex para devolver la posición de los partidos utilizando el método Execute, es decir

Function MYMATCH(strValue As String, strPattern As String, Optional blnCase As Boolean = True, Optional blnBoolean = True) As String 
    Dim objRegEx As Object 
    Dim strPosition As Integer 
    Dim RegMC 

    ' Create regular expression. 
    Set objRegEx = CreateObject("VBScript.RegExp") 
    With objRegEx 
     .Pattern = strPattern 
     .IgnoreCase = blnCase 
     If .test(strValue) Then 
      Set RegMC = .Execute(strValue) 
      MYMATCH = RegMC(0).firstindex + 1 
     Else 
      MYMATCH = "no match" 
     End If 
    End With 
End Function 

Sub TestMe() 
    MsgBox MYMATCH("test 1", "\d+") 
End Sub 
4

Para el beneficio de otros que pueden estar teniendo este problema, que finalmente lo descubrió.

Option Explicit 

Function CHAMATCH(strValue As String, strPattern As String, Optional blnCase As Boolean = True, Optional blnBoolean = True) As String 
    Dim objRegEx As Object 
    Dim objPosition As Object 
    Dim strPosition As String 

    ' Create regular expression. 
    Set objRegEx = CreateObject("VBScript.RegExp") 
    objRegEx.Pattern = strPattern 
    objRegEx.IgnoreCase = blnCase 

    ' Do the search match. 
    Set objPosition = objRegEx.Execute(strValue) 
    strPosition = objPosition(0).FirstIndex 

    CHAMATCH = strPosition 
End Function 

En lugar de un tipo Match, solo un habitual Object tipo hará (teniendo en cuenta todo lo que se está volviendo es una clase). Luego, si desea obtener la ubicación del índice, simplemente use .FirstIndex en la coincidencia [de su elección], o si desea el valor, us .Value