2011-11-28 19 views
7

Jak mogę pobrać pozycję pierwszego dopasowanego wyniku w wyrażeniu regularnym? Zobacz poniżej.Excel VBA Regex Pozycja dopasowania

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 

Po pierwsze, nie jestem do końca pewien, co .Match wraca (string, integer, itd.). Jedno znalezione rozwiązanie powiedziało, że powinienem utworzyć obiekt Match, a następnie pobrać z niego pozycję, ale w przeciwieństwie do , nie rozpoznaje obiektu Match. Ja również widziałem some code jak poniżej, ale nie jestem zawsze szuka wartości, tylko pierwszy placement ciąg:

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

Nieco pomijając żadnej z powyższych ewentualnych błędów składniowych (głównie ze względu na mnie zmianę zmiennej typy prawo i lewo), w jaki sposób łatwo to osiągnąć?

Dzięki!

+0

Masz rację, moja wina (zapomniałem, że pomaga to reputacji wszystkich osób na tej stronie) ... poza tym sam to wymyśliłem ... znowu. – Jonathan

+0

Jednak opublikuję odpowiedź w ciągu 8 godzin, aby uzyskać korzyści dla każdego, kto napotka na ten problem. – Jonathan

+1

Dlaczego 8 godzin, a nie teraz? – JimmyPena

Odpowiedz

12

Można użyć FirstIndex wrócić pozycję meczów stosując metodę Execute, tj

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

Z korzyścią dla innych, którzy mogą być ten problem, ale w końcu zorientowaliśmy się.

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 

Zamiast typu Match, tylko regularne Object typ zrobi (biorąc pod uwagę wszystko to wraca to klasa). Następnie, jeśli chcesz pobrać lokalizację indeksu, po prostu użyj .FirstIndex w meczu [do wyboru], lub jeśli chcesz wartość, nas .Value