【问题标题】:Regex match line Z only if preceded by line X but not if preceded by line Y正则表达式仅在行 X 之前匹配行 Z,但如果在行 Y 之前则不匹配
【发布时间】:2017-07-05 04:18:48
【问题描述】:

让我先说文本是逐行输入的。前瞻将不起作用。

因此,对于以下内容,我应该运行两个单独的正则表达式搜索。

这大约是我在大脑受伤之前使用正则表达式得到的结果:

案例一:

(?<!Case 2.)[\s\S]*?This line should match\.

案例 2:

(?<!Case 1.)[\s\S]*?This line should match\.

第一次正则表达式搜索应该为匹配文本的每一行返回一个成功的匹配:“This line should match.”在“案例 1”行之后。但在“案例 2”行之前。 (为了清楚起见,此处用括号 [])

第二个正则表达式搜索应该为匹配文本的每一行返回一个成功的匹配:`"This line should match."在“案例 2”行之后。但在“新序列开始”行之前。 (为了清楚起见,这里的括号())

在实际文本中,括号和括号不存在,并且两组不同的行在文本上是相同的。

正在搜索的文本:

Start of new sequence.
Random line(s).
Case 1.
Random line(s).
[This line should match.]
Random line(s).
[This line should match.]
Random line(s).
Case 2.
Random line(s).
(This line should match.)
Random line(s).
(This line should match.)
Random line(s).

Start of new sequence.
Random line(s).
Case 1.
Random line(s).
[This line should match.]
Random line(s).
[This line should match.]
Random line(s).
Case 2.
Random line(s).
(This line should match.)
Random line(s).
(This line should match.)

【问题讨论】:

    标签: regex


    【解决方案1】:

    您如何想象在您仍然没有的模式之前(或之后)进行条件匹配?
    因此,如果您收到该行,则可以匹配该模式(使用前瞻或任何其他构造)。

    我只是建议使用前瞻:

    (?<=Case 1\.).*?(\[This line should match.\]).*?(?=Case 2\.)
    

    (?<=Case 2\.).*?(\(This line should match.\)).*?(?=Start of new sequence\.)
    

    This 为您的示例做这项工作。

    【讨论】:

    • 不,这与我正在尝试做的事情还不太接近。首先,我不能使用前瞻,因为当信息进入时我正在聊天日志上运行此操作。当它到达应该匹配的行时,它应该是可以读取的最后一行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多