Perl正则表达式交换匹配组

Ili*_*sev 2 regex perl

我想出了一个用于解析GPG命令输出的正则表达式。

正则表达式:

^pub\s+(\S+)\s+(\S+)\s+.*\s+.{0,32}(.*)\s+(.*)<(\S+)>
Run Code Online (Sandbox Code Playgroud)

要匹配的文字:

pub   dsa1024 2018-02-28 [SCA]
      0019003A003E5A22E2337044D955066111F63B00
uid           [ unknown] John Doe <jogn@doe.name>
sub   elg1024 2018-02-28 [E]

Run Code Online (Sandbox Code Playgroud)

电流输出:

Group 1.    6-13    dsa1024
Group 2.    14-24   2018-02-28
Group 3.    69-77   11F63B00
Group 4.    78-112  uid           [ unknown] John Doe 
Group 5.    113-126 jogn@doe.name
Run Code Online (Sandbox Code Playgroud)

问题:

如何交换第2组第3组,仅使用正则表达式,所以第2组将有一个价值11F63B00第3组将有一个价值2018年2月28日。此外,我也想摆脱方括号(第4组)中的文本,包括方括号本身。

在线示例。

ike*_*ami 5

捕获的字符串按照在模式中找到捕获的顺序返回。

可以使用先行更改顺序。

/
   ^ pub \s+ (\S+) \s+ 
   (?=  \S+  \s+ .* \s+ .{0,32}(.*) \s+  .*  < \S+ > )
       (\S+) \s+ .* \s+ .{0,32} .*  \s+ (.*) <(\S+)>
/x
Run Code Online (Sandbox Code Playgroud)

如果用行来表达,我们将得到以下结果:

/
   ^ pub \h++ (\S++) \h++       # Line 1 (part 1)
   (?= .*+ \n                   # Line 1 (part 2)
       \h*+ \S*(\S{8})          # Line 2
   )
   (\S++) .*+ \n                # Line 1 (part 2)
   .*+ \n                       # Line 2
   (.*\S) \s++ <([^<>\s]++)>    # Line 3
/x
Run Code Online (Sandbox Code Playgroud)

(我也做到了,所以匹配失败会因习惯而无法更快地匹配。)

\S{32}\S*可接受的速度更快。)

(我也做到了,因此第四次捕获没有尾随空格。)


也就是说,更好的解决方案是在事实发生后修复订单。

@captures = @captures[0,2,1,3,4];
Run Code Online (Sandbox Code Playgroud)

要么

@captures[1,2] = @captures[2,1];
Run Code Online (Sandbox Code Playgroud)