RegExp从每个匹配开始捕获整个字符串

时间:2015-09-22 09:26:40

标签: regex

给出的文字:

First line bla bla
Second line RANDOM bla bla bla
Third line WORDS bla

想要获得两场比赛:

First line bla bla
Second line 

First line bla bla
Second line RANDOM bla bla bla
Third line 

目前正在尝试:

([\s\S]*?)((?:RANDOM)|(?:WORDS))

但我得到了:

First line bla bla
Second line 

 bla bla bla 
Third line 

问题是 - 第二场比赛是从字符串的开头开始的吗?     第三行

2 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式获取两个捕获的组:

(([\s\S]*?) RANDOM\b[\s\S]*?)(?= WORDS\b)

RegEx Demo

这将提供2组。

第1组:

First line bla bla
Second line RANDOM bla bla bla
Third line

第2组:

First line bla bla
Second line

答案 1 :(得分:2)

如果您只需要捕获文本,并且使用Java或.NET flavor regex,则可以尝试使用:

  1. <强> JAVA

    (?s)(?<=^(.{1,9999}))(?=.RANDOM|WORDS)
    

    DEMO

    在Java中,您可以在lookbehind中使用具有最小值和最大值的间隔 {min, max},它为您提供了一些有用的功能,但它也是 相当“丑陋”,太优雅的解决方案。通过夸张使用 间隔(如{1,999999})你可以得到类似的功能 使用量词+*。此外,s模式是DOTALL .必须与新行匹配。

  2. <强> NET

    (?s)(?<=^(.*))(?=.RANDOM|WORDS)
    

    DEMO

    .NET对lookbehind的内容没有限制,所以你可以 直接使用.*.+。再次使用s模式。随着变化:

    (?s)(?<=^((?:[^R]|R(?!ANDOM))*))(?=RANDOM)|(?s)(?<=^((?:[^W]|W(?!ORDS))*))(?=WORDS)
    

    DEMO

    仅匹配给定单词的第一次出现。