regex - Perl 正则表达式交换匹配组

标签 regex perl

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

正则表达式:

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

要匹配的文本:

pub   dsa1024 2018-02-28 [SCA]
      0019003A003E5A22E2337044D955066111F63B00
uid           [ unknown] John Doe <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c2a8ada5ac82a6ada7ecaca3afa7" rel="noreferrer noopener nofollow">[email protected]</a>>
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 <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="076d686069476368622969666a62" rel="noreferrer noopener nofollow">[email protected]</a>

问题:

如何交换组 2组 3(仅使用正则表达式),以便组 2 的值为 11F63B00 组 3 将具有值 2018-02-28。此外,我还想删除方括号中的文本(组 4),包括括号本身。

Online example.

最佳答案

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

可以使用前瞻来更改顺序。

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

关于regex - Perl 正则表达式交换匹配组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55760304/

相关文章:

Javascript 正则表达式用链接替换 ​​URL,但不在嵌入(或 img)标签中

python - scikit-learn:标记化时不要分隔带连字符的单词

regex - Perl 脚本与单行脚本 - 正则表达式的功能差异

perl - 如何防止 GD::Graph 写入最后一个 X 标签并覆盖我的其他标签?

ios - 正则表达式在 Swift 中获取方括号对之间的文本

JavaScript 负面回溯

r - 在每个字符处拆分字符串

java - linux 上哪种语言(python/perl/tcl)不需要安装第三方库?

linux - 使用 perl 的过程控制和并发程序

javascript - 如何获取包含所有重音字母、数字但不含 ".,;"和其他标点符号的主题标签