你如何返回vbscript正则表达式捕获组的第2到第n次匹配

时间:2014-11-29 19:54:09

标签: regex vba excel-vba excel

我有一个匹配特定文本字符串的正则表达式,然后应该返回匹配字符串旁边的单元格中的匹配项。我正在使用一个捕获组,所以可能有多个匹配。我能够毫无问题地返回第一场比赛,但我无法弄清楚如何返回第二场比赛到第n场比赛。

我的代码如下:

Sub splitUpComments()
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim strReplace As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("G2:G5")

    For Each c In Myrange
        strPattern = "(\S.+?[.?!])(?=\s+|$)"
        If strPattern <> "" Then
            strInput = c.Value
            strReplace = "$1"

            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With

            If regEx.test(strInput) Then
                c.Offset(0, 1) = regEx.Replace(strInput, "$1")
                c.Offset(0, 2) = regEx.Replace(strInput, "$2")
                c.Offset(0, 3) = regEx.Replace(strInput, "$3")
            Else
                'do nothing
            End If
        End If
    Next
End Sub

给定以下目标字符串:

"This is a test one.  This is a test two.  This is a test three."

我希望看到:

  • 这是一个测试。这是一个测试二。这是一个测试三。

您可以在Regex 101上看到正则表达式:Working Regular Expression

但我得到了:

This is a test one. This is a test two. This is a test three.       $2$2$2      $3$3$3

(其中第一个单元格包含整个目标字符串,后两列分别包含$ 2 $ 2 $ 2和$ 3 $ 3 $。)

看起来好像(1)正则表达式不起作用,(2)$ 2和$ 3表示第二和第三个捕获组,而不是第一个捕获组的第二个和第三个实例。任何人都可以对此有所了解。感谢。

2 个答案:

答案 0 :(得分:1)

对不起,我的vba知识有限,但你可以按照以下方式做点什么

i = 1
set MyMatches = regEx.test(strInput)
for each match in MyMatches
    c.Offset(0, i) = match
    i++
next

答案 1 :(得分:0)

您可以使用匹配对象访问匹配项,作为答案中指示的alpha bravo。只能使用RexEx对象的Execute方法创建有效的匹配对象。原始代码中缺少执行。在下面的代码中,我用Execute替换了文本,并且还使用了.Value方法来访问Match对象中的值。

            Set MyMatches = regEx.Execute(strInput)
            match_count = 0
            For Each Match In MyMatches
                match_count = match_count + 1
                c.Offset(0, match_count) = Match.Value
            Next

希望这有帮助。