在字符串出现在另一个字符串之后,并在下一次出现第三个字符串之前查找字符串

时间:2018-03-04 02:03:32

标签: regex

我正在尝试使用RegEx来查找字符串,但仅在它出现在另一个字符串之后且在下一次出现第三个字符串之前。

使用此文字:

one (random text) abc (random text) end two (random text) abc (random text) end three (random text) abc (random text) end

我想找到“abc”,只有它出现在“两个”之后和下一个“结束”之前。如果在“两个”之后有“结束”,中间没有“abc”,则根本不返回匹配。

以下表达式将从“两个”匹配到下一个“结束”,但我不知道在哪里放“abc”:

(?s)(?i)two(.*?)end

以下表达式不起作用,因为它在“two”之间找到“abc”,在“three”之后找到“end”:

(?s)(?i)two(.*?)abc(.*?)end

我在一个程序中使用它,使用RegEx来决定文件是否满足条件,所以我不确定它使用的语言。程序只需要知道条件是否存在,那么表达式实际返回的结果是不重要的 - 只是是否匹配。

任何帮助将不胜感激!

编辑澄清整个过程中有其他随机文本,并澄清所要求的行为。

1 个答案:

答案 0 :(得分:0)

您可以尝试以下模式:

Sub loopThroughMNFiles()

    Const MnLoopingFolder As String = "C:\Users\xxxxxx\Desktop\outlook-attachments\MN Reports\2-26-18\INSINQ\"

    Dim colFiles As New Collection, f
    Dim MnWbk As Workbook, MnFile As String, sheetName As String

    'add the files to a collection
    MnFile = Dir(MnLoopingFolder)
    Do While MnFile <> ""
        colFiles.Add MnFile
        MnFile = Dir()
    Loop

    Application.ScreenUpdating = False
    'loop over the filenames from the collection
    For Each f In colFiles
        INSINQ_Macro Workbooks.Open(Filename:=MnLoopingFolder & f)
    Next
    Application.ScreenUpdating = True
    MsgBox "Task Finished"
End Sub

以下是对模式的解释:

two(?:(?!(?:two|abc|end)).)*abc(?:(?!(?:two|abc|end)).)*end

Demo

基本思想是使用否定前瞻来谨慎地推进模式规则。