excel - VBA 将唯一的正则表达式附加到字符串变量

标签 excel regex vba function dictionary

如何从字符串中获取匹配的正则表达式,删除重复项,并将它们附加到以逗号分隔的字符串变量?

例如,在字符串“这是所需正则表达式的示例:BPOI-G8J7R9、BPOI-G8J7R9 和 BPOI-E5Q8D2”中,所需的输出字符串将为“BPOI-G8J7R9,BPOI-E5Q8D2”

我试图使用字典来删除重复项,但我的函数吐出了可怕的#Value 错误。

谁能看出我哪里出错了?或者有什么更好的方法来完成这项任务的建议吗?

代码如下:

Public Function extractexpressions(ByVal text As String) As String
Dim regex, expressions, expressions_dict As Object, result As String, found_expressions As Variant, i As Long

Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = "[A-Z][A-Z][A-Z][A-Z][-]\w\w\w\w\w\w"
regex.Global = True

Set expressions_dict = CreateObject("Scripting.Dictionary")

If regex.Test(text) Then
    expressions = regex.Execute(text)
End If

For Each item In expressions
    If Not expressions_dict.exists(item) Then expressions_dict.Add item, 1
Next

found_expressions = expressions_dict.items

result = ""

For i = 1 To expressions_dict.Count - 1
    result = result & found_expressions(i) & ","
Next i

extractexpressions = result

End Function

最佳答案

如果您从 Sub 调用您的函数,您将能够对其进行调试。

请参阅下面关于将匹配作为键添加到字典中的评论 - 如果您添加匹配对象本身,而不是显式指定匹配的 value 属性,您的字典将不会删除您的重复项匹配(因为两个或多个具有相同 valuematch 对象仍然是不同的对象)。

Sub Tester()
    Debug.Print extractexpressions("ABCD-999999 and DFRG-123456 also ABCD-999999 blah")
End Sub


Public Function extractexpressions(ByVal text As String) As String
    Dim regex As Object, expressions As Object, expressions_dict As Object
    Dim item
    
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "[A-Z]{4}-\w{6}"
    regex.Global = True
    
    If regex.Test(text) Then
        Set expressions = regex.Execute(text)
        Set expressions_dict = CreateObject("Scripting.Dictionary")
        For Each item In expressions
            'A dictionary can have object-type keys, so make sure to add the match *value*
            '  and the not match object itself
            If Not expressions_dict.Exists(item.Value) Then expressions_dict.Add item.Value, 1
        Next
        extractexpressions = Join(expressions_dict.Keys, ",")
    End If
End Function

关于excel - VBA 将唯一的正则表达式附加到字符串变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72208822/

相关文章:

c# - 如何在 Excel 电子表格上从 C# 更改工作表名称

excel - 如何测试单元格是否为空白或实际上是对 Excel 或 Google Sheets 中空白单元格的引用?

php - 从php中命名键值的字符串构建多维数组

ms-access - VBA手动创建BMP

excel - 如何在Excel中使用vba生成范围选择对话框?

Excel-VBA 如何阻止 FIND 方法在工作表结束后循环返回?

ruby - 用于在 ruby​​ 中修改字符串的简化正则表达式

java - 构建助手-maven-插件目标 :regex-property how to access generated property

Java 正则表达式 : Extract multiple sub-strings from a string

excel - 当单元格中的新数据发生更改时,将一行数据移到顶部