如何在BigQuery SQL中使用REGEXP_EXTRACT提取指定字符串片段
BigQuery中使用REGEXP_EXTRACT提取指定分段的实现方案
待处理示例字符串:b-12345_xx_aa_bbb_xsx-latam_jan_11_a12,目标是提取前4个下划线分隔的片段:b-12345、xx、aa、bbb。
核心正则逻辑
目标片段均为字符串开头按下划线_分割的前4个连续分段,正则匹配规则不需要考虑横杠、后续日期/版本类字符的干扰,核心匹配逻辑:
- 从字符串起始位置开始匹配
- 每个分段对应连续的非下划线字符,用捕获组标记
- 分段间固定匹配下划线分隔符
- 第四个分段后的所有剩余内容直接忽略,不做捕获
两种可直接运行的实现方式
方式1:复用同一正则提取全部分段(推荐,代码更简洁)
BigQuery的REGEXP_EXTRACT支持指定提取第几个捕获组的内容,无需为每个分段单独写正则,统一正则为^([^_]+)_([^_]+)_([^_]+)_([^_]+)_.*$,示例代码:
WITH test_data AS ( SELECT 'b-12345_xx_aa_bbb_xsx-latam_jan_11_a12' AS raw_str ) SELECT raw_str, REGEXP_EXTRACT(raw_str, r'^([^_]+)_([^_]+)_([^_]+)_([^_]+)_.*$', 1, 1, '', 1) AS seg1, -- 返回b-12345 REGEXP_EXTRACT(raw_str, r'^([^_]+)_([^_]+)_([^_]+)_([^_]+)_.*$', 1, 1, '', 2) AS seg2, -- 返回xx REGEXP_EXTRACT(raw_str, r'^([^_]+)_([^_]+)_([^_]+)_([^_]+)_.*$', 1, 1, '', 3) AS seg3, -- 返回aa REGEXP_EXTRACT(raw_str, r'^([^_]+)_([^_]+)_([^_]+)_([^_]+)_.*$', 1, 1, '', 4) AS seg4 -- 返回bbb FROM test_data
参数说明:最后一个入参为捕获组序号,传几就返回对应括号内匹配到的内容。
方式2:单字段独立正则匹配(适合仅需提取个别分段的场景)
如果不需要一次性提取4个分段,可以给每个目标写独立的短正则,逻辑更直观:
- 提取
b-12345:REGEXP_EXTRACT(raw_str, r'^([^_]+)_') - 提取
xx:REGEXP_EXTRACT(raw_str, r'^[^_]+_([^_]+)_') - 提取
aa:REGEXP_EXTRACT(raw_str, r'^[^_]+_[^_]+_([^_]+)_') - 提取
bbb:REGEXP_EXTRACT(raw_str, r'^[^_]+_[^_]+_[^_]+_([^_]+)_')
匹配验证
以上两种写法都不会被后续字符串中包含的横杠、数字、下划线干扰,执行后返回的4个字段值完全匹配预期提取结果。
内容的提问来源于stack exchange,提问作者Jaffet León
相关产品推荐
相关产品推荐

