【问题标题】:RegEx Find all occurrences and instances of multiple words if they exist in a stringRegEx 查找多个单词的所有出现和实例(如果它们存在于字符串中)
【发布时间】:2013-10-09 00:34:07
【问题描述】:

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

我正在尝试将 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

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

【问题讨论】:

    标签: regex vba excel vbscript


    【解决方案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

    【讨论】:

    • 您又一次帮了大忙!我将不得不进行一些修改并测试我的实际配置。如果我遇到任何问题,我会回复。
    • 像魅力一样工作:D
    猜你喜欢
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多