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的主要内容,如果未能解决你的问题,请参考以下文章

python贪婪和非贪婪

正则表达式贪婪与非贪婪模式

python基础:re模块匹配时贪婪和非贪婪模式

python基础:re模块匹配时贪婪和非贪婪模式

贪婪模式与非贪婪模式

python正则表达式贪婪与非贪婪模式