我有一个样本的多行字符串,如下所示:
Button
我希望将[+] x: somerandomstuff
[!] blah
[+] x: somemorerandomstuff
[-] blah
[+] START
[+] x: 1st group to match
[!] blah
[-] blah
[+] x: 2nd group to match
[+] END
后面的字符串与x:
的行匹配,而仅 [+] x: (...)
和{{1}之间的字符串}。预期的结果将是两组(可能会有更多):
[+] START
请注意,只有一个START / END实例。
我只设法找到与第一组相匹配的东西:
[+] END
我目前缺乏扩展此正则表达式以匹配其他行的知识。我不确定如何在另一种模式(1st group to match
2nd group to match
和\[\+\] START.*?\[\+\] x: (.*?)\n.*\[\+\] END
)之间寻找与模式匹配的多条线
REGEX101链接:https://regex101.com/r/kCgwhr/2
注意:我知道只有正则表达式的解决方案可能不是最好的解决方案,但我想用正则表达式来解决这个问题。
答案 0 :(得分:3)
我假设您使用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
- 省略之前匹配的所有内容(因此我们只匹配我们真正想要的内容).*
我们想要的内容在regex 101中查看它。