繁体   English   中英

返回两行之间以[+]开头的所有行的子字符串

[英]Return substring of all lines that start with [+] between two specific lines

我有一个示例多行字符串,如下所示:

[+] x: somerandomstuff
[!] blah
[+] x: somemorerandomstuff
[-] blah
[+] START
[+] x: 1st group to match
[!] blah
[-] blah
[+] x: 2nd group to match
[+] END

我想在看起来像[+] x: (...)行中匹配x:之后的字符串,但匹配[+] START[+] END之间的那些字符串。 预期结果将是两个组(可能会更多):

1st group to match
2nd group to match

请注意,只有一个START / END实例。

我只设法提出了与第一组相匹配的东西:

\[\+\] START.*?\[\+\] x: (.*?)\n.*\[\+\] END

我目前缺乏扩展此正则表达式以匹配其他行的知识。 我不确定如何在另一个模式( [+] START[+] END )之间寻找与某个模式匹配的多行

REGEX101链接: https ://regex101.com/r/kCgwhr/2

注意:我知道仅使用正则表达式的解决方案可能不是这里最好的方法,但是我想仅使用正则表达式解决此问题。

我假设您使用的是PCRE兼容的正则表达式,就像您在PCRE模式下使用regex101一样。

您可以使用\\ G连续匹配(和一些先行的东西)来匹配您想要的内容:

(?:\[\+\] START|\G(?!\A))\R(?:(?!\[\+\] x:)(?!\[\+\] END).*\R)*\[\+\] x:\s*\K.*

这符合:

  • (?:\\[\\+\\] START|\\G(?!\\A)) -开始顺序或在上一场比赛之后。 \\G在第一次调用正则表达式时在字符串开头匹配,因此(?!\\A)确保仅在找到第一个匹配项后才使用\\G
  • \\R任何换行序列
  • (?:(?!\\[\\+\\] x:)(?!\\[\\+\\] END).*\\R)* -既不以结束序列也不以我们想要的序列开头的任意数量的行匹配(基本上跳过它们)
  • \\[\\+\\] x:\\s* -开始我们要匹配的序列
  • \\K忽略之前匹配的所有内容(因此,我们仅匹配我们真正想要的内容)
  • .*我们想要的行的内容

看到它在正则表达式101中工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM