Regex on Presto



我有这样的数据:a35={"abc":"D1,9,12, 23, 24, 25, 26"}在一个列上。

我想做的是,使用Presto,仅当且仅当我在json的开头有"abc":"D1时,在新列上提取id(在本例中为a35)。

到目前为止,我试图让这个正则表达式提取id,但是没有成功,没有什么回报我的查询…

--sample data
WITH dataset(id_str) AS (
SELECT ('a35={"abc":"D1,9,12, 23, 24, 25, 26"}')
)
--query
SELECT regexp_extract_all(id_str, '"b(?<id>w{3})={"abc":"D1,"')
FROM dataset;

任何想法?

对于这个用例来说,这是一个完全多余的方法,但它可能对更高级的应用程序有用:

WITH dataset(id_str) AS (
SELECT ('a35={"abc":"D1,9,12, 23, 24, 25, 26"}')
)
SELECT map_keys(
map_filter(
CAST(
json_parse(regexp_replace(id_str, '(d|w*)=(.*)', '{"$1":$2}') -- Converts string to valid JSON.
) as MAP<VARCHAR, JSON>) -- Converts JSON to MAP of JSON
, (k,v) -> starts_with(CAST(json_extract(v, '$.abc') AS VARCHAR), 'D1')) -- Filters only the desired values
) as keys -- extracts the keys.
FROM dataset

输出:

键th>{a35}

实际上答案是正确的,我只是在正则表达式上多了两个引号。正确答案是:

--sample data
WITH dataset(id_str) AS (
SELECT ('a35={"abc":"D1,9,12, 23, 24, 25, 26"}')
)
--query
SELECT regexp_extract_all(id_str, 'b(?<id>w{3})={"abc":"D1,')
FROM dataset;

作为参考,我已经使用https://regex101.com/

验证了正则表达式:

最新更新