指定正则表达式组的结尾

Specify end of regex group

我正在尝试创建一个匹配多个组的正则表达式,以便可以提取组之间的值。每组看起来都一样。

让我们考虑下面的例子,注意换行符是有意的:

dog 1
wuff
wuff
cat
123
XYZ
dog 1
wuff
wuff
cat
456
ABC
dog 1
wuff
wuff
cat
789

因此,使用正确的正则表达式我想得到输出:

123
XYZ
456
ABC
789

在 regex101.com 我试过:

(?s)(?:dog.*cat)

匹配第一次出现 dog 和最后一次出现 cat 之间的所有值。

另外我试过:

(?s)(?:dog.*(cat){1})

据我所知,应该匹配第一次出现的 cat 然后结束该组,但它没有。

感谢任何帮助。

您可以在 MULTILINE 模式下使用此正则表达式来捕获 dog.*cat 匹配后的值:

^dog\b(?:.*\n)+?cat\n(.*(?:\n.*)*?)(?=\ndog|\Z)

您的值出现在捕获组 #1 中

RegEx Demo

正则表达式详细信息:

  • ^: 匹配起始行
  • dog\b:匹配单词dog和单词边界
  • (?:.*\n)+?:匹配任何后跟换行符的内容。重复此 1+ 次(懒惰)
  • cat\n:匹配 cat 后跟一个换行符
  • (.*(?:\n.*)*?):这些是您对第一个捕获组感兴趣的多行值。
  • (?=\ndog|\Z):前瞻断言我们在换行后或当前位置
  • 之前的输入结束后有一个dog