【问题标题】:Find a string when it occurs after another string, and before the next occurrence of a third string在另一个字符串之后和第三个字符串下一次出现之前查找一个字符串
【发布时间】:2018-03-04 23:24:05
【问题描述】:

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

使用此文本:

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

我想找到“abc”,只要它出现在“two”之后和下一个“end”之前。如果“二”后面有“和”,中间没有“abc”,则不返回任何匹配项。

下面的表达式将从“two”匹配到下一个“end”,但我不知道“abc”应该放在哪里:

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

以下表达式不起作用,因为它在“二”和“三”之后的“结束”之间找到了一个“abc”:

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

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

任何帮助将不胜感激!

进行了编辑,以阐明自始至终还有其他随机文本并阐明所请求的行为。

【问题讨论】:

    标签: regex


    【解决方案1】:

    您可以尝试以下模式:

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

    下面是对模式的解释:

    two                         - match 'two'
    (?:(?!(?:two|abc|end)).)*   - match anything other than 'two', 'abc', or 'end'
    abc                         - match 'abc'
    (?:(?!(?:two|abc|end)).)*   - match anything other than 'two', 'abc', or 'end'
    end                         - match 'end'
    

    Demo

    基本思想是使用负前瞻来谨慎地按照您的模式规则前进。

    【讨论】:

    • 嗨@Tim Biegeleisen,感谢您的回复。很抱歉,我忘了澄清在“abc”之前和之后有随机附加文本,所以我无法搜索整个“two abc end”字符串,因为我不知道还有什么可能包含。 (我将编辑我的问题以澄清这一点)。所以我需要一种方法来查找“two”,然后是“abc”,然后是“end”,其中“end”和“abc”可能会在其余文本中出现多次,并停止查找如果在“abc”之前的“two”之后找到“end”,则不返回匹配项。
    • @Rob 我用新模式更新了我的答案。比以前丑多了,但我相信它符合你的要求。
    猜你喜欢
    • 1970-01-01
    • 2015-12-08
    • 2021-09-11
    • 2016-10-09
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多