JS正则MatchAll:从含内嵌逗号的字符串提取对象的问题
正则提取键值对时处理值中含逗号的问题
你遇到的问题是原正则用了[^,]*匹配值,导致遇到值里的逗号就直接截断了——比如E的值里的,55E被当成了下一个键值对的分隔符,只拿到了E 444。
要解决这个问题,得换个思路匹配值:不能单纯用逗号作为终止符,而是要匹配到**下一个键值对的起始标记(, 键名:)**或者字符串结尾。可以用正向预查来实现这个逻辑,修改后的正则如下:
const regexp = /([^:]+): ?(.*?)(?=, [^,:]+:|$)/g;
拆解下这个正则的关键部分:
([^:]+):匹配键名,直到遇到冒号(支持键名带空格,比如B B): ?:匹配冒号和可选的空格(.*?):非贪婪模式匹配值内容,避免过度匹配(?=, [^,:]+:|$):正向预查,指定终止条件:要么是, 键名:的下一个键值对开头,要么是字符串末尾
接下来用完整代码验证:
const str = 'A: 100 - 200, B B: Test & Test2, Tes3, C:, D: 11 22, E: E 444,55E'; const regexp = /([^:]+): ?(.*?)(?=, [^,:]+:|$)/g; const result = {}; let match; while ((match = regexp.exec(str)) !== null) { const key = match[1].trim(); // 去掉键名前后可能的空格 const value = match[2].trim(); result[key] = value; } console.log(result);
运行后得到的结果完全符合预期:
{ 'A': '100 - 200', 'B B': 'Test & Test2, Tes3', 'C': '', 'D': '11 22', 'E': 'E 444,55E' }
另外给键和值都加了trim(),是为了处理像C:这种键后面直接跟逗号的情况,确保值为空字符串而不是可能的空格。
内容的提问来源于stack exchange,提问作者Ranjith
相关产品推荐
相关产品推荐

