bigquery 非贪婪 REGEXP_EXTRACT
Posted
技术标签:
【中文标题】bigquery 非贪婪 REGEXP_EXTRACT【英文标题】:bigquery non greedy REGEXP_EXTRACT 【发布时间】:2021-08-17 16:14:12 【问题描述】:如何为 REGEXP_SUBSTR 函数提取最短匹配(惰性、非贪婪)?
Regex .*?
应该返回非贪婪结果。
但是 bigquery REGEXP_SUBSTR 返回 "r": ["l": 10, "s": 1, "t": ["1"], "l": 100, "s": 3, "t": ["3", "4"]
而不是 "l": 100, "s": 3, "t": ["3", "4"]
与 regex = r'\.*?"t": \["3", "4"\]\'
有这方面的提示吗?
注意:JSONPATH 不适用于我(即 bigquery 不支持 jsonpath 数组过滤器。)
WITH tbl AS (
SELECT r'"r": ["l": 10, "s": 1, "t": ["1"], "l": 100, "s": 3, "t": ["3", "4"]]' AS jstr
)
SELECT
jstr
,REGEXP_EXTRACT(jstr, r'\.*?"t": \["3", "4"\]\') AS e1
FROM tbl
【问题讨论】:
【参考方案1】:BigQuery 确实支持 JSON 路径。我认为这对你有用:
JSON_QUERY(jstr, '$.r[0].t')
至于您的正则表达式,据我所知,它与标准正则表达式行为一致。
我认为问题是您希望非贪婪运算符找到此子字符串的最短匹配项,但这并不是它的真正意图。非贪婪运算符只是说“在寻找匹配项时尽可能少地重复” - 正则表达式找到第一个大括号,尽可能少地使用字符,直到它命中 '[3, 4]',然后停止 - - 成功!
如果您处于贪婪模式,它会继续搜索另一个可能的 '[3, 4]' 匹配。在非贪婪模式下,它会停在第一个 - 但不会回溯以获得可能的绝对最小序列。
【讨论】:
带过滤器的 JSON_QUERY 不适用于 bigquery。我很想找到带有 ['3', '4'] 的t
而不是带有 ['1'] 的 t
也许我应该使用带有交叉连接的 JSON_QUERY_ARRAY 并通过 where 子句进行过滤。
感谢您对non-greedy
搜索模式的解释:)
啊,对过滤器的了解。您的 JSON_QUERY_ARRAY 计划听起来很合理。以上是关于bigquery 非贪婪 REGEXP_EXTRACT的主要内容,如果未能解决你的问题,请参考以下文章