如何用Perl正则交换捕获组并清理GPG命令输出内容
嘿,我帮你调整了正则表达式,刚好能实现你要的两个效果——交换组2和组3的内容,同时把组4里的方括号和里面的文本去掉:
^pub\s+(\S+)\s+\S+\s+.*\s+.{0,32}(\S+)\s+(?<=pub\s+\S+\s+(\S+)\s+.*)\s+uid\s+\[.*?\]\s*(.*?)<(\S+)>
具体实现说明
咱们拆解一下这个正则是怎么满足需求的:
1. 交换组2与组3的内容
原正则里组2抓的是日期2018-02-28,组3抓的是密钥末尾11F63B00。现在我调整了捕获逻辑:
- 组1:还是
(\S+),负责抓加密算法dsa1024; - 组2:通过
(\S+)直接捕获密钥末尾的11F63B00(也就是原组3的内容); - 组3:用正向回顾后发断言
(?<=pub\s+\S+\s+(\S+)\s+.*)回溯前面的内容,把日期2018-02-28(原组2的内容)抓进来,这样就实现了两个组内容的交换。
2. 清理组4的内容
原组4包含uid [ unknown] John Doe,现在我用uid\s+\[.*?\]\s*(.*?)来处理:
uid\s+\[.*?\]\s*精准跳过uid [ unknown]这部分不需要的内容;(.*?)只捕获纯名字John Doe作为组4的结果,彻底去掉了方括号和里面的文本。
测试后的捕获组结果
用你给的待匹配文本测试,最终捕获组输出会是:
- 组1:
dsa1024 - 组2:
11F63B00 - 组3:
2018-02-28 - 组4:
John Doe - 组5:
jogn@doe.name
完全符合你的要求!
内容的提问来源于stack exchange,提问作者Ilia Ross
相关产品推荐
相关产品推荐

