我正在尝试使用 RegEx 来获取特定字符串对之间存在的不同字符串的所有实例。例如。在以下字符串中:
“开始。你好。杰米。再见。中间。你好。莎拉。再见。结束”
我想通过在 "Hello. "
和 "Hello. "
之间检查来获取由 "Jamie"
和 "Sarah"
组成的集合/数组“。再见。”
我的 RegEx 对象工作正常,我觉得我即将成功:
Sub Reggie()
Dim x As String: x = "The Start. Hello. Jamie. Bye. The Middle. Hello. Sarah. Bye. The End"
Dim regEx As RegExp
Set regEx = New RegExp
Dim rPat1 As String: rPat1 = "Hello. "
Dim rPat2 As String: rPat2 = " Bye."
Dim rPat3 As String: rPat3 = ".*"
With regEx
.Global = True
.ignorecase = True
.Pattern = "(^.*" & rPat1 & ")(" & rPat3 & ")(" & rPat2 & ".*)"
.MultiLine = True
' COMMAND HERE
End With
End Sub
但是最后一点COMMAND HERE
我正在尝试.replace(x, "$2")
它给了我一个匹配的最后一个实例的字符串,即莎拉
我尝试过 .Execute(x)
它给了我一个 MatchCollection
对象,当浏览即时窗口时,我看到该对象仅具有匹配的最后一个实例.
我所要求的是否可能以及如何实现?
最佳答案
这是因为 .*
匹配尽可能多的字符,并且您不应该通过在正则表达式的两端添加 .*
来匹配整个字符串。
此外,您需要转义正则表达式模式中的特殊字符,这里 .
是特殊的,因为它匹配除换行符之外的任何字符。
您需要修复您的正则表达式声明,例如
rPat1 = "Hello\. "
rPat2 = " Bye\."
rPat3 = ".*?"`
.Pattern = rPat1 & "(" & rPat3 & ")" & rPat2
或者,为了进一步增强正则表达式,您可以
- 将文字空格替换为
\s*
(零个或多个空格)或\s+
(一个或多个空格)以支持任何空格 - 将捕获字符串后的任何非单词字符与
\W+
或\W*
进行匹配。
rPat1 = "Hello\.\s*"
rPat2 = "\W+Bye\."
rPat3 = ".*?"`
.Pattern = rPat1 & "(" & rPat3 & ")" & rPat2
请参阅regex demo 。 详细信息:
Hello\.
-Hello.
字符串\s*
- 零个或多个空格(.*?)
- 第 1 组:除了换行符之外的任何零个或多个字符,尽可能少\W+
- 除 ASCII 字母/数字/_
之外的一个或多个字符再见\.
-再见。
字符串。
关于VBA 中所有匹配项的正则表达式数组/列表/集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67532936/