VBA从RegEx.Execute获取唯一值

时间:2015-05-08 20:38:21

标签: regex excel vba

如何过滤RegEx.Execute()仅包含唯一匹配?

目前我有这个:

Set allMatches = RE.Execute(text)

我知道我可以通过以下方式遍历元素:

For i = 0 To allMatches.Count - 1

Next

3 个答案:

答案 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位数组:123456789。我们需要将[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