Bigquery 正则表达式 - 删除双引号中的逗号

Posted

技术标签:

【中文标题】Bigquery 正则表达式 - 删除双引号中的逗号【英文标题】:Big query regular expression - remove comma in double quotes 【发布时间】:2021-11-22 03:40:59 【问题描述】:

基本上我需要拆分 json 字符串并选择特定属性(在 unnest 之后)

键和值未知"date":"2011-01-01","ok_key":"ok_value","ok_key2":"value2","key3":"no_okay,str_2"

我试过了:

用逗号分割,因为字符串中有逗号,所以不起作用 使用正则表达式替换字符串中的逗号,但大查询中的 RE2 实现没有 支持后视

我现在有一个替代方案:

replace(json_query(attributes,"$"), '","', '"|separator|"')

创建我自己的分隔符来替换“好”逗号,然后我可以使用我定义的这个分隔符进行拆分..

有没有办法替换 Big Query 中双引号之间的逗号?只是好奇。

所需的输出是 2 个字符串列:

Col_Key、Col_Value “日期”、“2011-01-01” “ok_key”、“ok_value” "ok_key2","value2" "key3", "no_okay,str_2"

我现在的解决方法是 split(translate(replace(json_query(bada_json_str,"$"), '","', '"|separator|"'),"",""),'|separator|')

它不能完美运行,因为 JSON 值说 INT 类型可能没有双引号括起来

【问题讨论】:

预期的输出是什么?另外,你事先知道键名吗? 每当你给出一个例子时,请展示你想要的结果。这对你来说可能很清楚,但对读者来说可能不是。你想用不在双引号内的逗号分割字符串吗? 要将字符串拆分为不在双引号内的逗号,您可以匹配以下正则表达式:(?:^|,)([^,"]*(?:(?:"[^"]*")[^,"]*)*)(?=,|$)。不在引用字符串中的逗号之间的匹配被保存到捕获组 1。Demo... ...对于您的示例,来自捕获组 1 的匹配如下:"date":"2011-01-01""ok_key":"ok_value""ok_key2":"value2""key3":"no_okay,str_2"。将光标悬停在链接上的正则表达式的某些部分上以获取其功能的描述。只要支持积极的前瞻,这应该可以工作。 谢谢,这正是重点。 Big Query RE2 实现不支持前瞻后瞻。我用笨拙的替换“好”逗号和“好冒号”解决了 【参考方案1】:

在下面使用

select key, value
from data, unnest(bqutil.fn.json_extract_keys(attributes)) key with offset
join unnest(bqutil.fn.json_extract_values(attributes)) value with offset
using(offset)    

如果应用于您问题中的样本数据 - 输出是

【讨论】:

你试过了吗?对你有用吗?

以上是关于Bigquery 正则表达式 - 删除双引号中的逗号的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式删除由双引号划定的 CSV 字段中的双引号

仅从数字中删除双引号

正则表达式从 CSV 中删除双引号

使用正则表达式转义单引号字符串中的所有双引号 [重复]

正则表达式中的双引号

php用正则表达式怎么取双引号里面的内容??