我有一个匹配特定文本字符串的正则表达式,然后应该返回匹配字符串旁边的单元格中的匹配项。我正在使用一个捕获组,所以可能有多个匹配。我能够毫无问题地返回第一场比赛,但我无法弄清楚如何返回第二场比赛到第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表示第二和第三个捕获组,而不是第一个捕获组的第二个和第三个实例。任何人都可以对此有所了解。感谢。
答案 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
希望这有帮助。