Excel VBA 正则表达式匹配位置

8

如何获取正则表达式中第一个匹配结果的位置?请参见下文。

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对象。我还看到过像下面这样的一些代码,但我并不一定要求值,只需要第一个字符串的位置:
If allMatches.count <> 0 Then
    result = allMatches.Item(0).submatches.Item(0)
End If

有点忽略上面可能出现的语法错误(主要是由于我不断改变变量类型),我该如何轻松地实现这个目标?

谢谢!


你说得对,是我的错(我忘了这会有助于大家在这个网站上的声誉)...除此之外,我自己解决了问题...再一次。 - Jon Lawton
然而,我会在8小时后发布我的答案,以便其他遇到这个问题的人受益。 - Jon Lawton
1
为什么是8小时而不是现在? - JimmyPena
因为我没有足够的声望来立即发布。 - Jon Lawton
2个回答

14

你可以使用Execute方法和FirstIndex属性来返回匹配的位置,例如:

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

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

不必使用Match类型,只需使用普通的Object类型即可(考虑到它返回的是一个类)。然后,如果您想获取索引位置,只需在匹配项[of your choice]上使用.FirstIndex,或者如果您想要值,则使用.Value


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接