BigQuery 的 Regex Positive Lookbehind 替代方案
Regex Positive Lookbehind alternative for BigQuery
我有一个正则表达式,它从列中的参数中提取值,其中很少有用“|”分隔的额外参数。字段中的参数顺序不正确。
我的正则表达式:
^(?:_AB=)[^\|]*
例如:
extraparams
regexp_results
_A=0|_AB=0|_ABC=132|_AC=0|_ACD=TEST|_ADU=9|TEST_P=1
0
_A=0|AG=INFO|_ABC=132|_ACD=EXP|_AD=9
NULL
此解决方案一直有效,直到我不得不在 BigQuery 中使用它。您是否有想法在不使用 Positive Lookbehind 的情况下重写此模式?
这行得通吗?
SELECT extraparams, REGEXP_REPLACE(REGEXP_EXTRACT(extraparams, r'_AB=(.+?\|){1}'), '\|','') AS regexp_results FROM ( SELECT '_A=0|_AB=0|_ABC=132|_AC=0|_ACD=TEST|_ADU=9|TEST_P=1' AS extraparams UNION ALL SELECT '_A=0|AG=INFO|_ABC=132|_ACD=EXP|_AD=9' AS extraparams )
同时考虑以下方法
select extraparams,
( select split(kv, '=')[safe_offset(1)]
from unnest(split(extraparams, '|')) kv
where split(kv, '=')[offset(0)] = '_AB'
) as regexp_results
from your_table
如果应用于您问题中的示例数据 - 输出为
我有一个正则表达式,它从列中的参数中提取值,其中很少有用“|”分隔的额外参数。字段中的参数顺序不正确。
我的正则表达式:
^(?:_AB=)[^\|]*
例如:
extraparams | regexp_results |
---|---|
_A=0|_AB=0|_ABC=132|_AC=0|_ACD=TEST|_ADU=9|TEST_P=1 | 0 |
_A=0|AG=INFO|_ABC=132|_ACD=EXP|_AD=9 | NULL |
此解决方案一直有效,直到我不得不在 BigQuery 中使用它。您是否有想法在不使用 Positive Lookbehind 的情况下重写此模式?
这行得通吗?
SELECT extraparams, REGEXP_REPLACE(REGEXP_EXTRACT(extraparams, r'_AB=(.+?\|){1}'), '\|','') AS regexp_results FROM ( SELECT '_A=0|_AB=0|_ABC=132|_AC=0|_ACD=TEST|_ADU=9|TEST_P=1' AS extraparams UNION ALL SELECT '_A=0|AG=INFO|_ABC=132|_ACD=EXP|_AD=9' AS extraparams )
同时考虑以下方法
select extraparams,
( select split(kv, '=')[safe_offset(1)]
from unnest(split(extraparams, '|')) kv
where split(kv, '=')[offset(0)] = '_AB'
) as regexp_results
from your_table
如果应用于您问题中的示例数据 - 输出为