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

MySQL中JSON字段正则匹配:匹配指定键值对并终止于首个大括号

解决MySQL中JSON正则匹配的贪婪问题

首先,你的问题根源在于正则表达式的贪婪匹配特性:.会匹配任意字符(包括大括号),而默认的贪婪模式会尽可能匹配最长的内容,导致你的正则越过了Record channels HDCVI对应的对象闭合括号,匹配到了后面HDD amount里的"4"}。

针对这个场景,我们可以通过限制匹配范围来避免贪婪问题,具体正则和查询语句如下:

正则匹配解决方案

使用[^}](匹配除了闭合大括号}之外的任意字符)来替代.,这样就能确保我们只在Record channels HDCVI对应的对象内部匹配,不会超出到其他字段。

对应的MySQL查询语句:

SELECT * FROM your_table_name
WHERE your_json_column REGEXP '"Record channels HDCVI"\\s*:\\s*\\{\\s*"1"\\s*:\\s*"4"[^}]*\\}';

正则部分拆解:

  • "Record channels HDCVI":精准匹配目标键名
  • \\s*:\\s*:匹配键名后的冒号,允许前后有任意空白字符(空格、制表符等)
  • \\{:匹配JSON对象的开括号{
  • \\s*"1"\\s*:\\s*"4":匹配键为"1"、值为"4"的键值对,同样允许前后空白
  • [^}]*:匹配任意非}的字符,确保不会越过当前对象的闭合括号
  • \\}:匹配当前对象的闭合括号}

更可靠的替代方案:使用MySQL JSON函数

虽然你要求用REGEXP,但还是推荐使用MySQL内置的JSON处理函数,因为正则匹配JSON容易受格式变化(比如键值对顺序、空格多少)影响,而JSON函数是专门为JSON数据设计的,准确率更高:

-- 方法1:使用JSON_EXTRACT
SELECT * FROM your_table_name
WHERE JSON_EXTRACT(your_json_column, '$.Record channels HDCVI."1"') = '"4"';

-- 方法2:使用->>操作符(更简洁)
SELECT * FROM your_table_name
WHERE your_json_column->>'$.Record channels HDCVI."1"' = '4';

->>操作符会直接返回不带引号的字符串值,所以我们可以直接和'4'比较,不需要处理引号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:25:52