Jvd*_*vdV 5 regex arrays excel vba
背景:
刚才,我正在回答一个问题,并在玩弄RegEx内VBA。目标是创建存在于字符串中的名称列表。RegEx是VBA首选解决方案,因为我们希望防止偶然发现看起来相似的标点符号和子字符串,例如:Jack或Jacky。
样本数据:
让我举一个简单的例子。想象一下我们有一个像这样的字符串:
Dim str As String: str = "Jack's turn, Becky's or Frank?"
Run Code Online (Sandbox Code Playgroud)
我们想知道字符串中提到了某个数组中的哪些名称,例如:
Dim arr As Variant: arr = Array("Jack", "Frank")
Run Code Online (Sandbox Code Playgroud)
示例代码:
为了防止对数组进行迭代,我使用了以下代码:
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
Run Code Online (Sandbox Code Playgroud)
问题:
虽然上面会整齐地返回两个命中,但它不区分大小写。例如,更改以下行只会返回Jack:
Dim str As String: str = "Jack's turn, Becky's or frank?"
Run Code Online (Sandbox Code Playgroud)
我想我可以通过使用(?i)以下方法关闭区分大小写来解决这个问题:
regex.Pattern = "(?i)\b(" & Join(arr, "|") & ")\b"
Run Code Online (Sandbox Code Playgroud)
但问题是这对于大多数语言(这里是 test)来说都是完美的,但是它VBA似乎有问题并Error 5017在执行时生成一个。
题:
有人知道为什么吗?这是不支持VBA还是我的语法错误?如果不支持,在保留Join名称数组的可能性的同时,有什么替代方法可以让点击不区分大小写?
奖金问题:
最终我想通过分隔符Join将Hits它们放在一起,例如:
Debug.Print Join(regex.Execute(str),", ")
Run Code Online (Sandbox Code Playgroud)
但是,我意识到执行会返回一个集合并首先需要迭代,这是我想避免的。
QHa*_*arr 10
在 RegExp 对象上设置属性,即
regex.ignorecase = True
Run Code Online (Sandbox Code Playgroud)
RegExp 对象具有三个影响正则表达式应用方式的属性:
IgnoreCase:我相信这是不言自明的
全局:确定是否在输入字符串中查找所有可能的匹配项。如果 Global 设置为 false,则仅会找到或替换第一个匹配项(如适用)。
MultiLine:确定匹配是否可以跨越换行符。
另请参阅:https : //docs.microsoft.com/en-us/previous-versions//1400241x%28v%3dvs.85%29
来自https://www.regular-expressions.info/vbscript.html关于 VBScript 的正则表达式支持,因为我们使用的是 Microsoft VBScript 正则表达式 5.5
没有用于在正则表达式中设置匹配选项的模式修饰符。