簡體   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