如何过滤RegEx.Execute()
仅包含唯一匹配?
目前我有这个:
Set allMatches = RE.Execute(text)
我知道我可以通过以下方式遍历元素:
For i = 0 To allMatches.Count - 1
Next
答案 0 :(得分:1)
答案在你的问题中。虽然for each next
更清洁,但可能更快。然后添加到脚本字典。键是唯一的,因此如果已经在字典中则会出错。
Set Dict = CreateObject("Scripting.Dictionary")
On Error Resume Next
For each line in AllMatches
Dict.Add Line, ""
If Err.Number <> 0 then err.clear
Next
For Each thing in Dict.Keys()
Outp.writeline thing
Next
答案 1 :(得分:1)
使用词典但没有不必要的错误处理
Sub recut()
allMatches = Array("apple", "bannana", "apple", "pear")
Set objdict = CreateObject("Scripting.Dictionary")
For Each objmatch In allMatches
If Not objdict.exists(objmatch) Then objdict.Add objmatch, 1
Next
End Sub
答案 2 :(得分:0)
您可以在匹配项周围使用捕获组,并在负面预测中使用反向引用。
想象一下,我们需要来自123 456 789 123 456 789
的唯一3位数组:123
,456
和789
。我们需要将[0-9]{3}
放入像([0-9]{3})
这样的捕获组中,然后检查字符串后面是否没有重复此捕获的组。所以,我们只捕获最后一个重复的组。
([0-9]{3})(?!.*?\1.*$)
示例VBA代码:
Sub REGEXP_TEST_UNIQUE()
Dim strPattern As String
Dim strInput As String
Dim regEx As New RegExp
Dim objMatches As MatchCollection
strInput = "123 456 789 123 456 789"
strPattern = "([0-9]{3})(?!.*?\1.*$)"
With regEx
.Global = True
.Pattern = strPattern
End With
If regEx.test(strInput) Then
Set objMatches = regEx.Execute(strInput)
For i = 0 To objMatches.Count - 1
Range("A2").Value = Range("A2").Value + " + " + objMatches.Item(i)
Next
End If
End Sub
“A2”单元格值变为:
123 + 456 + 789