2011-11-28 50 views
7

如何獲取正則表達式中第一個匹配結果的位置?見下文。Excel VBA正則表達式匹配位置

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 

其中之一,我不完全確定.Match正在返回什麼(字符串,整數等)。我發現的一個解決方案說我應該創建一個Match對象,然後從那裏抓取該位置,但與不同,不識別Match對象。我也看到some code像下面,但我不一定要找的價值,僅僅是第一字符串配置:

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

有點忽略上述任何(可能的語法錯誤主要是由於我改變變量類型的權利和左),我怎麼輕鬆/簡單地完成這一點?

謝謝!

+0

你是對的,我的錯(我忘了它有助於每個人的聲譽在這個網站上)......除此之外,我還是自己想出了......。 – Jonathan

+0

但是,我會在8小時內發佈我的答案,以便爲遇到此問題的其他人提供幫助。 – Jonathan

+1

爲什麼8個小時,而不是現在? – JimmyPena

回答

12

您可以使用FirstIndex返回使用Execute方法匹配的位置,即

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

對於其他人誰可能有這個問題的好處,我終於想通了。

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 

取而代之的是Match型的,只是一個普通的Object類型會做(考慮所有它的返回是一個類)。然後,如果你想抓住索引位置,只需在[你選擇的]匹配上使用.FirstIndex,或者如果你想要的價值,我們.Value