regex 在第一个字符匹配时停止的正则表达式

kq4fsx7k  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(146)

我正在解析一个json,并在它上面应用正则表达式。

{"value":"{\"123\":{\"type\":\"TAGGING\",\"role\":\"RESULT\",\"payload\":[{\"values\":{\"qbc\":\"not-abc\",\"def\":\"yes\",\"ghi\":\"gh\"}}]}}"}

Regexp used :
REGEXP_EXTRACT(JSON_EXTRACT_SCALAR(
        Opfields,
        '$.value'
    ),
    '.*"abc":(.*?),',
    1
) abc

现在这对abc有效,因为abc值后面有一个逗号,但对ghi无效。对于ghi,我知道在这个例子中我可以使用}。但问题是,abc、ghi等缩放器值可能以不同的顺序出现,在这种情况下,它可能以逗号或}结束。
我正在寻找一个表达式,它将在任何情况下工作,无论顺序是什么。本质上,我想要abc、def和ghi的值,不管它们以什么顺序出现在json中。
有人可以建议一个好方法来做到这一点。
我已经提到了我尝试过的regexp

ruoxqz4g

ruoxqz4g1#

你不需要在这里使用正则表达式,根据显示的数据,你似乎只有一个双重编码的JSON(即value包含一个JSON字符串,其中包含一个编码的JSON),因此您可以再次解析它并将其作为JSON处理。使用Presto(由于它有限的JSON路径支持),涉及到Map和数组的一些转换会有点麻烦:

-- sample data
with dataset(opfields) as(
    values ('{"value":"{\"123\":{\"type\":\"TAGGING\",\"role\":\"RESULT\",\"payload\":[{\"values\":{\"abc\":\"not-abc\",\"def\":\"yes\",\"ghi\":\"gh\"}}]}}"}')
)

-- query
select JSON_EXTRACT(js1, '$.values.abc') abc,
       JSON_EXTRACT(js1, '$.values.ghi') ghi
from dataset,
    unnest (cast(JSON_PARSE(JSON_EXTRACT_SCALAR(opfields, '$.value')) as map(varchar, json))) as t(k, js),
    unnest (cast(JSON_EXTRACT(js, '$.payload') as array(json))) as t1(js1);

输出:

Abc   | ghi
-----------------+-----------
 "not-abc" | "gh"

如果你真的在使用特里诺,你可以使用json_query

select json_query(JSON_EXTRACT_SCALAR(opfields, '$.value'), 'strict $.*.payload[*].values.abc' WITHOUT ARRAY WRAPPER) sensitivity,
       json_query(JSON_EXTRACT_SCALAR(opfields, '$.value'), 'strict $.*.payload[*].values.ghi' WITHOUT ARRAY WRAPPER) certainty
from dataset;

相关问题