RegEx查找字符串中存在的多个单词的所有出现次数和实例

时间:2013-10-09 00:34:08

标签: regex vba excel-vba vbscript excel

这是RegEx Only Return matches if words are present between two words

的延续

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

我还为以下内容制作了一个RegEx Tester Link: 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

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

1 个答案:

答案 0 :(得分:1)

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

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

regex101 demo

(?:(?: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