我想出了一个解析 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),包括括号本身。
最佳答案
捕获的字符串按照在模式中找到捕获的顺序返回。
可以使用前瞻来更改顺序。
/
^ 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/