[英]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.