如何從字串中獲取匹配的正則運算式,洗掉重復項,并將它們附加到一個字串變數中,每個變數用逗號分隔?
例如,在字串中,“這是所需正則運算式的示例: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
uj5u.com熱心網友回復:
如果您從 Sub 呼叫您的函式,您將能夠除錯它。
請參閱下面有關將匹配項作為鍵添加到字典的注釋 - 如果您添加匹配物件本身,而不是顯式指定匹配項的value屬性,您的字典不會洗掉匹配項的重復項(因為match具有相同的兩個或多個物件value是仍然是不同的物件)。
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
uj5u.com熱心網友回復:
VBA 的正則運算式物件實際上支持對先前捕獲組的反向參考。因此,我們可以通過運算式本身獲取所有唯一項:
([A-Z]{4}-\w{6})(?!.*\1)
查看在線
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/472663.html
上一篇:獲取沒有范圍的名稱的值
