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
相关产品推荐
相关产品推荐

