我想打印两者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}"'
关于regex - 如何在 Perl 中提取并打印这些命名捕获组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58134467/