Regex 正则表达式组合行

Regex 正则表达式组合行,regex,combinations,pcre,Regex,Combinations,Pcre,给定以下字符串 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]*) 替换为: $1;$2 如图所示 如您所见,

给定以下字符串

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]*)
替换为:

$1;$2
如图所示

如您所见,这并没有给出expact结果


任何帮助都将不胜感激。

您可以使用正则表达式

^(.+)\r?\n(?=(?:.*\r?\n){3}(.+))
对于给定的示例,有四个匹配项:45op0、tr ico、JJB Be和tyuh。每场比赛有两个捕获组。第一个捕获组包含匹配本身。对于第一个匹配45op0,捕获组2包含113-4997,在正向前瞻中捕获。然后,可以将两个捕获组的内容连接起来,用分号分隔,以返回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

在应用程序层中,这几乎肯定要容易得多。您使用的是什么语言?这与我提出的类似,但我找不到完全删除最后4行的方法。我能做的最好的方法是将它们减少到a;。这就是为什么我建议它应该在应用程序层中执行。@Nick,处理正则表达式匹配项的任何操作都需要代码,但OP没有给出我们正在使用的语言,所以我只能这样做了。如果变量str和r分别持有字符串和my regex,那么在Ruby中,可以编写str.gsubr.map{| |,a | m=Regexp.last_match;%s;%s%[m[1],m[2]}=>[45op0;113-4997,tr ico;202076,JJB Be;acure,tyuh;sala-mandra]。我希望它在任何其他通用语言中都是类似的。没有必要对最后4行做任何事情。非常感谢@Caryswovel,我将替换为1美元$2\r现在正是我在底部的+附加部分中所要求的。我可以轻松地删除应用程序中的这些行。为了完整起见,可以在表达式中添加一些不返回这些行的内容吗?我不明白为什么必须删除最后四行。我认为这是阅读全部8行并返回4行和您的轻微更改,或者以不同的方式查看,将所有8行替换为生成的4行。顺便说一下,在我上面提到的Ruby代码中,我想我应该编写result=;str.gsubr.each{m=Regexp.last_match;result 45op0;113-4997\ntr ico;202076\nJJB Be;acure\ntyuh;sala mandra\n。我将在上午检查。我必须删除最后4行,因为所需的结果已经在前4行。我没有使用Ruby或任何类似的语言。Regex比我正在使用的应用程序快很多数量级,因此re这可以用Regex做得更好。即使得到一个结果并对其应用另一个Regex,也是有益的。您提供的已经足够好了。再次感谢。