【问题标题】:bigquery non greedy REGEXP_EXTRACTbigquery 非贪婪 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

【问题讨论】:

    标签: regex google-bigquery


    【解决方案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 计划听起来很合理。
    猜你喜欢
    • 2011-08-25
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多