Background:
刚才我正在回答一个问题,正在玩玩RegEx
within VBA
。目标是创建字符串中存在的名称列表。RegEx
是首选解决方案,因为我们想防止VBA
绊倒看起来相似的标点符号和子字符串,例如:Jack
or Jacky
.
Sample Data:
让我举一个简单的例子。想象一下我们有一个像这样的字符串:
Dim str As String: str = "Jack's turn, Becky's or Frank?"
我们想知道字符串中提到了某个数组中的哪些名称,例如:
Dim arr As Variant: arr = Array("Jack", "Frank")
Sample Code:
为了防止对数组进行迭代,我使用了以下代码:
Sub Test()
Dim str As String: str = "Jack's turn, Becky's or Frank?"
Dim arr As Variant: arr = Array("Jack", "Frank", "Beth")
Dim regex As Object: Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = "\b(" & Join(arr, "|") & ")\b"
regex.Global = True
Set hits = regex.Execute(str)
For Each hit In hits
Debug.Print hit
Next hit
End Sub
Problem:
虽然上面的代码可以整齐地返回两次命中,但它不能不区分大小写。例如,更改以下行只会返回Jack
:
Dim str As String: str = "Jack's turn, Becky's or frank?"
我想我可以通过使用关闭区分大小写来解决这个问题(?i)
:
regex.Pattern = "(?i)\b(" & Join(arr, "|") & ")\b"
但问题是这对于大多数语言来说都可以完美工作(在这里测试 https://regex101.com/r/Cq0P39/2), 然而VBA
似乎有问题并生成Error 5017
执行后。
Question:
有人知道为什么吗?这是否不支持VBA
或者我的语法错误?如果不支持,有什么替代方法可以让命中不区分大小写,同时保留以下可能性Join
名称数组?
Bonus-Question:
最终我想Join
the Hits
通过分隔符连接在一起,例如:
Debug.Print Join(regex.Execute(str),", ")
然而,我意识到执行返回一个集合并且需要首先迭代,这是我想避免的。