如何在 perl 中提取和打印这两个命名的捕获组?

How do I extract and print both these named capture groups in perl?

我想打印 gclidsession 命名的捕获,但是我的正则表达式在与 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}"'