匹配标签之间的文本

时间:2014-02-04 08:28:33

标签: regex

当结束标记不重复时,如何匹配标记之间的文本? 例如:

DATA GOES HERE
aaa
DATA GOES HERE
bbb

目标是捕获“aaa”和“bbb”。我尝试了以下正则表达式,但它无法匹配第二批;

^(DATA\sGOES\sHERE).*?\k<1>

以上结果始终是第一批;

DATA GOES HERE
aaa
DATA GOES HERE

感谢。

3 个答案:

答案 0 :(得分:2)

尝试使用:

(?s)^(DATA GOES HERE\R)(.+?)(?=\1|\z)

您想要的字符串位于第2组。

答案 1 :(得分:1)

假设标签始终为DATA GOES HERE

(?<=DATA GOES HERE[\r\n]).+

以下是RegexBuddy的输出显示匹配:

match

说明: -

  • (?<=DATA GOES HERE[\r\n]) - 这是一个积极的看法。这意味着'确保前面有'。
  • .+一个或多个字符(不是换行符)。

基本上,这会查找以DATA GOES HERE为一行的任何字符集。 lookbehind是零长度,因此它不参与匹配的文本,这就是为什么你只得到aaabbb,我假设你是想要的。

根据评论进行更新

  

如果换行符是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之后的最后一个文本。

结果:

enter image description here

答案 2 :(得分:0)

你可以尝试

(?:DATA GOES HERE\n(.+)(?=|$))+

捕获标记之间的文本(aaabbb)。

Regular expression visualization

Debuggex Demo