Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用BQ正则表达式提取带有“的元素”;“字符串”;作为分隔符_Sql_Regex_Google Bigquery - Fatal编程技术网

Sql 使用BQ正则表达式提取带有“的元素”;“字符串”;作为分隔符

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

我在构建一个BQ regex表达式时遇到了问题,该表达式以Key=Value表达式的形式从一组带有变量分隔符的文本中提取给定的项

我所说的字符串示例如下:

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