如何用正则提取类JSON字符串中的多组键值对?
解决类JSON字符串的键值对提取问题
你的原正则问题在于.*是贪婪匹配,会把冒号后到字符串结尾的所有内容都当成单个value,导致无法拆分多组键值对。针对Markdown图片自定义属性的场景(无需严格JSON语法),可以用这个正则来精准提取:
/(\w+)\s*:\s*(['"]?)(.*?)\2(?:\s*,\s*|(?=\}))/g
正则各部分说明:
(\w+):捕获键名,匹配字母、数字和下划线组成的属性名\s*:\s*:匹配冒号,同时忽略前后可能的空格(['"]?):捕获可选的单/双引号(如果值有包裹的话),用分组存起来后续引用(.*?):非贪婪匹配属性值,遇到对应的闭合引号或者分隔逗号/右大括号就停止\2:匹配和前面捕获的引号一致的闭合引号,保证引号成对(?:\s*,\s*|(?=\})):匹配键值对之间的分隔逗号(带前后空格),或者最后一个键值对后的右大括号位置,非捕获组不影响结果提取
使用示例(JavaScript):
const attrStr = "{float: 'null', another: 'foo', align: center}"; const regex = /(\w+)\s*:\s*(['"]?)(.*?)\2(?:\s*,\s*|(?=\}))/g; const attrs = {}; let match; while ((match = regex.exec(attrStr)) !== null) { attrs[match[1]] = match[3]; } console.log(attrs); // 输出:{ float: 'null', another: 'foo', align: 'center' }
这个正则支持带引号或不带引号的属性值,兼容键值对间的任意空格,完全适配你提到的Markdown自定义属性解析场景。
内容的提问来源于stack exchange,提问作者KyleFontenot
相关产品推荐
相关产品推荐

