当结束标记不重复时,如何匹配标记之间的文本? 例如:
DATA GOES HERE
aaa
DATA GOES HERE
bbb
目标是捕获“aaa”和“bbb”。我尝试了以下正则表达式,但它无法匹配第二批;
^(DATA\sGOES\sHERE).*?\k<1>
以上结果始终是第一批;
DATA GOES HERE
aaa
DATA GOES HERE
感谢。
答案 0 :(得分:2)
尝试使用:
(?s)^(DATA GOES HERE\R)(.+?)(?=\1|\z)
您想要的字符串位于第2组。
答案 1 :(得分:1)
假设标签始终为DATA GOES HERE
:
(?<=DATA GOES HERE[\r\n]).+
以下是RegexBuddy的输出显示匹配:
说明: -
(?<=DATA GOES HERE[\r\n])
- 这是一个积极的看法。这意味着'确保前面有'。.+
一个或多个字符(不是换行符)。基本上,这会查找以DATA GOES HERE
为一行的任何字符集。 lookbehind是零长度,因此它不参与匹配的文本,这就是为什么你只得到aaa
和bbb
,我假设你是想要的。
根据评论进行更新
如果换行符是CRLF,那么它也不起作用,当有多行要捕获时
关于CRLF的正确性,+
之后应该有[\r\n]
。要匹配多行,您可以使用以下内容:
(?<=(DATA GOES HERE[\r\n]+)).[\s\S]+?(?=\1)|(?<=DATA GOES HERE[\r\n]+).[\s\S]+
更新如下:
[\s\S]+
任何字符,包括新行。 |
=或。现在它将匹配DATA GOES HERE
块之间或DATA GOES HERE
之后的最后一个文本。结果:
答案 2 :(得分:0)