1

如果两个单词之间存在单词,这是 RegEx Only Return 匹配的延续

我正在尝试将 RegEx 与 vbScript 或 VBA 一起使用,并在字符串中查找所有出现的特定单词。该字符串来自一个大型配置文件并包含其他数据,但我可以使用另一个 RegEx 命令解析出我需要的字符串块。在我下面的测试例程中,它找到每个 OR'd 单词的第一次出现并停止。我试图返回找到的每个单词的所有出现和实例(如果它们存在于字符串中)。我似乎无法弄清楚如何让它循环或继续检查......

我还为以下内容制作了 RegEx 测试器链接: http ://regex101.com/r/zP8aT3

Sub TestRegEx_1()
Dim TestString, X
Dim objRegEx, f_objResults, f_Match

TestString = "edit GoodMatch1 ;mode" & vbCrLf & _
    "Something Random" & vbCrLf & _
    "KeyWord_2 A B and C and also D E" & vbCrLf & _
    "Something Random" & vbCrLf & _
    "Something Random" & vbCrLf & _
    "KeyWord_3 1 A and 2 B" & vbCrLf & _
    "Something Random" & vbCrLf & _
    "KeyWord_1 1 2 and 3 and also 4 5" & vbCrLf & _
    "Something Random" & vbCrLf & _
    "exit"

Set objRegEx = CreateObject("VBScript.RegExp")
objRegEx.IgnoreCase = True
objRegEx.MultiLine = True
objRegEx.Global = True

objRegEx.Pattern = "^edit\s(.*?)\s\;mode[\S\s]*?(?=.*?\b(KeyWord_1|KeyWord_2|KeyWord_3|NonExistant_1)\b)(?=.*?\b(1|2|3|A|B|C|8|9|10|X|Y\Z)\b)[\S\s]*?exit$"
Set f_objResults = objRegEx.Execute(TestString)
For Each f_Match In f_objResults
    'MsgBox f_Match
    For Each X In f_Match.submatches
        MsgBox X
    Next
Next

End Sub

我想要达到的目标如下:

'Expected f_Match.SubMatches Output in a loop
'GoodMatch1
'KeyWord_2
'A
'B
'C
'KeyWord_3
'1
'A
'2
'B
'KeyWord_1
'1
'2
'3

或类似且可行的...如果需要任何其他信息,请告诉我。任何帮助是极大的赞赏。谢谢你!

4

1 回答 1

1

好吧,如果这次您不介意不捕获整个块,您可以使用我为您之前的问题编写的前两个正则表达式的修改:

(?:(?:edit (\S+))|(KeyWord_1|KeyWord_2|KeyWord_3)|\b([0-9A-Z])\b)(?=(?:(?!edit[^;]+;mode )[\s\S])*?exit)

正则表达式101演示

(?:(?:edit (\S+))|(KeyWord_1|KeyWord_2|KeyWord_3)|\b([0-9A-Z])\b)

是一个大组,分为 3 个可能的匹配项:

(?:edit (\S+))获取编辑名称。

(KeyWord_1|KeyWord_2|KeyWord_3)获取关键字

\b([0-9A-Z])\b获取字母/数字

而且我认为您可以使用之前的“整个块”正则表达式来首先提取块,然后使用这个来获取各个关键字。不幸的是,该“块正则表达式”不能进行单独的捕获,因为不允许重叠匹配,并且由于您已经匹配整个块,因此您需要为要获取的每个部分拥有一个捕获组,这不是很实用。 ..除非有一种我还不知道的方法来做到这一点。=P

于 2013-10-10T19:11:27.583 回答