You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BigQuery中REGEXP_SUBSTR如何实现非贪婪(惰性)最短匹配?

问题根因

你写的正则r'\{.*?"t": \["3", "4"\]\}'虽然用了非贪婪匹配.*?,但正则引擎会优先从字符串最左侧的第一个匹配\{的位置(也就是整个JSON最外层的{)开始匹配,非贪婪规则仅保证从起始位置开始匹配到目标后缀的最短长度,无法自动跳转到更靠后的{位置作为匹配起点,因此会包含前面多余的JSON内容。

解决方案

把正则里的通配符.*?替换为排除{的匹配规则[^{]*?,确保匹配起点是离目标"t": ["3", "4"]最近的{,不会跨多个JSON对象匹配。修改后的正则为:r'\{[^{]*?"t": \["3", "4"\]\}'

测试SQL

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

执行后e1的输出就是你预期的{"l": 100, "s": 3, "t": ["3", "4"]}。

注意事项

如果你的JSON内容中存在包含转义{的字符串值,需要进一步调整正则适配转义场景,常规无转义大括号的JSON结构下以上方案可直接使用。

内容的提问来源于stack exchange,提问作者obarisk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:12:00