regex - 如何在 perl 中提取和打印这两个命名的捕获组?
问题描述
我想打印和命名的捕获,但我gclid
的session
正则表达式一旦匹配 gclid 就会退出:
echo '"https://example.com/foo/?gclid=abc1234gef76786" session="765dsfsdf7657657khkjh"' | perl -nE '/(?<gclid>gclid=[^&"#\s]*)|(?<session>session=.*)/&&say"gclid: $+{gclid} session: $+{session}"'
结果是:
gclid: gclid=abc1234gef76786 session:
但我想要:
gclid: gclid=abc1234gef76786 session: session="765dsfsdf7657657khkjh"
这echo
只是将要处理的数百万行中的一个示例行。
解决方案
那是因为您正在使用|
运算符,因此当两个模式中的任何一个匹配时,正则表达式匹配就会停止。您可以.*
在两种模式之间使用。放在\b
前面session
以确保单词边界:
perl -nE '/(?<gclid>gclid=[^&"#\s]*).*(?<session>\bsession=.*)/&&say"gclid: $+{gclid} session: $+{session}"'
推荐阅读
- django - 在 Django 模板中显示银行账户余额的推荐方法
- symfony - Symfony 多域登录
- discord.js - 如何获取我的 Discord 机器人的创建日期?
- c - 访问返回的指针时出现分段错误
- html - 将 url 插入自定义 Django 电子邮件模板
- c# - 有什么方法可以确保最终用户获得与我在 SpeechSynthesizer 中使用的 TTS 相同的声音?
- java - FXMLLoader 中 loader.setLocation 中的路径错误
- nosql - 我们可以在 Couchbase 中拥有超过 1024 个节点吗?
- java - 来自 HTTPS 请求的 SSLException 通过 SOCKS 代理上的套接字
- c - 我无法解决此错误 [Error] cannot convert 'list**' to 'list*' for argument '1' to 'void remplire(list*)'