如何在BigQuery中绕过正则单捕获组限制提取URL的tn参数值
BigQuery提取URL中event?后的tn参数(单捕获组/无UNNEST方案)
问题背景
需要从以下示例URL的event?之后任意位置提取tn参数值,原正则表达式tn=(.+?)(&|$)因包含两个捕获组不符合BigQuery单捕获组限制,同时希望避免使用UNNEST防止数据重复。
示例URL:
https://google.com/d/track/event?upid=12345&url=https://www.mywebsite.com/&tn=o_rnpp4126&val=100.00&cache_buster=15&ps=2https://google.com/d/track/event?upid=12345&url=https://www.mywebsite.com/&val=100.00&cache_buster=15&ps=2&tn=o_rnpp4126
方案1:优化正则(单捕获组)
将原正则的第二个捕获组改为非捕获组((?:...)),这样整个表达式仅保留一个捕获组,符合BigQuery要求:
SELECT REGEXP_EXTRACT(url, r'tn=([^&]+)(?:&|$)') AS tn_value FROM your_table
[^&]+:匹配tn=后直到下一个&或字符串结尾的所有字符(避免非贪婪匹配的性能损耗)(?:&|$):非捕获组,仅用于定位参数结束位置,不生成额外捕获组
方案2:无正则/无UNNEST的字符串处理
利用BigQuery字符串函数直接定位截取,完全避免正则和UNNEST:
SELECT SPLIT( SUBSTR(url, STRPOS(url, 'tn=') + 3), '&' )[ORDINAL(1)] AS tn_value FROM your_table WHERE STRPOS(url, 'tn=') > 0 -- 过滤不含tn参数的行
如果需要严格限定只在event?之后的部分提取:
SELECT SPLIT( SUBSTR( SPLIT(url, 'event?')[ORDINAL(2)], -- 截取event?后的查询串部分 STRPOS(SPLIT(url, 'event?')[ORDINAL(2)], 'tn=') + 3 ), '&' )[ORDINAL(1)] AS tn_value FROM your_table WHERE STRPOS(SPLIT(url, 'event?')[ORDINAL(2)], 'tn=') > 0
- 先通过
SPLIT(url, 'event?')[ORDINAL(2)]拿到event?之后的查询参数部分 - 用
STRPOS定位tn=的位置,截取后续内容后按&拆分取第一个元素
内容的提问来源于stack exchange,提问作者HybridFenix
相关产品推荐
相关产品推荐

