首页 > 解决方案 > 如何在 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只是将要处理的数百万行中的一个示例行。

标签: regexperlnamed-captures

解决方案


那是因为您正在使用|运算符,因此当两个模式中的任何一个匹配时,正则表达式匹配就会停止。您可以.*在两种模式之间使用。放在\b前面session以确保单词边界:

perl -nE '/(?<gclid>gclid=[^&"#\s]*).*(?<session>\bsession=.*)/&&say"gclid: $+{gclid} session: $+{session}"'

推荐阅读