Perl 正则表达式交换匹配组



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

正则表达式:

^pubs+(S+)s+(S+)s+.*s+.{0,32}(.*)s+(.*)<(S+)>

要匹配的文本:

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

电流输出:

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

问题:

如何仅使用正则表达式交换组 2 和组 3,因此组 2 的值为 11F63B00组 3 的值为 2018-02-28此外,我还想删除方括号内的案文(第4组(,包括括号本身。

在线示例。

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

可以使用

前瞻更改顺序。

/
   ^ pub s+ (S+) s+ 
   (?=  S+  s+ .* s+ .{0,32}(.*) s+  .*  < S+ > )
       (S+) s+ .* s+ .{0,32} .*  s+ (.*) <(S+)>
/x

如果我们用线条来表达,我们会得到以下内容:

/
   ^ 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

(我也这样做了,出于习惯,匹配失败无法更快地匹配。

(如果可以接受,S{32}会比S*快。

(我也这样做了,所以第四次捕获没有尾随空格。


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

@captures = @captures[0,2,1,3,4];

@captures[1,2] = @captures[2,1];

如果您的数据在d文件中

perl -ane 'if($F[1]==2) {$n=<>;@k=split /s+/,$n;@j=split /s+/;s/$j[3]/$k[3]/;$n=~s/$k[3]/$j[3]/;print "$_$n" } else {s/[.*].+//;print}' d

最新更新