Sql 使用BQ正则表达式提取带有“的元素”;“字符串”;作为分隔符
我在构建一个BQ regex表达式时遇到了问题,该表达式以Key=Value表达式的形式从一组带有变量分隔符的文本中提取给定的项 我所说的字符串示例如下:Sql 使用BQ正则表达式提取带有“的元素”;“字符串”;作为分隔符,sql,regex,google-bigquery,Sql,Regex,Google Bigquery,我在构建一个BQ regex表达式时遇到了问题,该表达式以Key=Value表达式的形式从一组带有变量分隔符的文本中提取给定的项 我所说的字符串示例如下: house=长岛&house:@newamsterdam@@house=德克萨斯州 令牌分隔符和密钥分隔符是已知的。 在这种情况下: Token delimiters = {' = ' | ' : @'} key delimiters = { && | @@ } 我想要结果 long island New Amsterd
house=长岛&house:@newamsterdam@@house=德克萨斯州
令牌分隔符和密钥分隔符是已知的。
在这种情况下:
Token delimiters = {' = ' | ' : @'}
key delimiters = { && | @@ }
我想要结果
long island
New Amsterdam
Texas
REGEXP\u EXTRACT\u ALL(“house=长岛&house:@newamsterdam”,regex)代码>
我的正则表达式有问题:
考虑下面的例子
with t as (
select 'house = long island && house : @New Amsterdam @@ house = Texas' txt
)
select result
from t,
unnest(split(regexp_replace(txt, r'[=&:@]', ''), 'house')) result
where result != ''
有输出
或更通用的解决方案
with t as (
select 'house = long island && house : @New Amsterdam @@ house = Texas' txt
)
select
arr[offset(0)] as key,
arr[offset(1)] as value
from t,
unnest(split(regexp_replace(regexp_replace(txt, r' && | @@ ', '|||'), r' = | : @', '&&&'), '|||')) kv,
unnest([struct(split(kv, '&&&') as arr)])
有输出
使用
REGEXP\u EXTRACT\u ALL(txt,'house\W*([^&@:]*[^&@:\s]))
看
解释
--------------------------------------------------------------------------------
房子‘房子’
--------------------------------------------------------------------------------
\W*非单词字符(除a-z、a-z、0以外的所有字符)-
9,u)(0次或更多次(匹配最大
(可能的金额)
--------------------------------------------------------------------------------
(组和捕获到\1:
--------------------------------------------------------------------------------
[^&@:]*除“&”、“@”、“以下”以外的任何字符(0)
或更多次(与最大金额匹配)
(可能的)
--------------------------------------------------------------------------------
[^&@:\s]除以下字符外的任何字符:'&','@',':',
空白(\n、\r、\t、\f和“”)
--------------------------------------------------------------------------------
)结束\1