给出的文字:
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
问题是 - 第二场比赛是从字符串的开头开始的吗? 第三行
答案 0 :(得分:2)
您可以使用此正则表达式获取两个捕获的组:
(([\s\S]*?) RANDOM\b[\s\S]*?)(?= WORDS\b)
这将提供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,则可以尝试使用:
<强> JAVA 强>
(?s)(?<=^(.{1,9999}))(?=.RANDOM|WORDS)
在Java中,您可以在lookbehind中使用具有最小值和最大值的间隔
{min, max}
,它为您提供了一些有用的功能,但它也是
相当“丑陋”,太优雅的解决方案。通过夸张使用
间隔(如{1,999999}
)你可以得到类似的功能
使用量词+
或*
。此外,s
模式是DOTALL
.
必须与新行匹配。
<强> NET 强>
(?s)(?<=^(.*))(?=.RANDOM|WORDS)
.NET对lookbehind的内容没有限制,所以你可以
直接使用.*
或.+
。再次使用s
模式。随着变化:
(?s)(?<=^((?:[^R]|R(?!ANDOM))*))(?=RANDOM)|(?s)(?<=^((?:[^W]|W(?!ORDS))*))(?=WORDS)
仅匹配给定单词的第一次出现。