Excel VBA正则表达式匹配位置

Jon*_*han 7 regex excel vba 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
Run Code Online (Sandbox Code Playgroud)

首先,我不完全确定.Match返回的是什么(字符串,整数等).我找到的一个解决方案说我应该创建一个Match对象,然后从那里抓取位置,但与不同,不识别该Match对象.我也看过一些类似下面的代码,但我不一定要查找值,只是第一个字符串放置:

If allMatches.count <> 0 Then
    result = allMatches.Item(0).submatches.Item(0)
End If
Run Code Online (Sandbox Code Playgroud)

有点忽略上面任何可能的语法错误(主要是由于我左右改变变量类型),我如何轻松/简单地完成此操作?

谢谢!

bre*_*tdj 12

您可以使用FirstIndexExecute方法返回匹配位置,即

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
Run Code Online (Sandbox Code Playgroud)


Jon*_*han 5

为了其他可能遇到这个问题的人的利益,我终于弄清楚了。

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
Run Code Online (Sandbox Code Playgroud)

而不是Match类型,只需常规Object类型即可(考虑到它返回的只是一个类)。然后,如果您想获取索引位置,只需.FirstIndex在[您选择的]匹配上使用,或者如果您想要该值,我们.Value