正则表达式组合线
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}(.+))
对于给出的示例,有四个匹配项:45op0
、tr ico
、JJB Be
和 tyuh
。每场比赛都有两个捕获组。第一个捕获组包含匹配本身。对于第一个匹配项 (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
给定以下字符串
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}(.+))
对于给出的示例,有四个匹配项:45op0
、tr ico
、JJB Be
和 tyuh
。每场比赛都有两个捕获组。第一个捕获组包含匹配本身。对于第一个匹配项 (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