我想出了一个用于解析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组)中的文本,包括方括号本身。
捕获的字符串按照在模式中找到捕获的顺序返回。
可以使用先行更改顺序。
/
^ 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)