正则表达式组合线

Regex combine lines

给定以下字符串

45op0
tr ico
JJB Be
tyuh
113-4997
202076
acure
sala mandra

我正在寻找以下结果:

45op0;113-4997
tr ico;202076
JJB Be;acure
tyuh;sala mandra

基本上将底部的 4 行与顶部的 4 行按原始顺序组合在一个 ; 分隔列表中。

这是我目前使用的正则表达式:

^((?:[^\r*\n]*[\r*\n]){4})([\s\S]*)

替代者:

;

如图所示demo

如您所见,这并没有给出预期的结果。

任何帮助将不胜感激。

您可以使用正则表达式

^(.+)\r?\n(?=(?:.*\r?\n){3}(.+))

PCRE demo

对于给出的示例,有四个匹配项:45op0tr icoJJB Betyuh。每场比赛都有两个捕获组。第一个捕获组包含匹配本身。对于第一个匹配项 (45op0),捕获组 2 包含包含 113-4997,这是在正先行中捕获的。然后可以将两个捕获组的内容连接起来,用分号分隔,以 return 45op0;113-4997

同样,对于第二场比赛,捕获组 2 包含 202076,依此类推。

当到达行 113-4997 时,它被保存在 cap grp 1 中,接下来的三行被消耗,然后正则表达式失败,因为后面没有非空行。对于下一行,正则表达式失败,因为它无法跳过三行。

PCRE 正则表达式引擎执行以下操作。

^(.+)          match a line with 1+ chars, excl. line terminators,
               in cap grp 1 
\r?\n          match the newline and possible carriage return
(?=            begin a positive lookahead
  (?:.*\r?\n)  match an entire line in a non-cap group          
  {3}          execute the non-cap group 3 times (skip 3 lines)
  (.+)         match a line with 1+ chars, excl. line terminators,
               in cap grp 2
)              end positive lookahead