如何使用JS正则表达式匹配字符串中指定的类对象模式片段
正则提取指定JSON对象片段方案
你之前的正则匹配到字符串末尾,核心原因是.*属于贪婪匹配规则,会尽可能匹配最长的符合规则的内容,直到找到字符串中最后一个}才终止,因此会把后续的其他对象片段也包含进去。
修正后的正则写法
只需要将贪婪匹配改成非贪婪匹配即可,两种常用写法如下:
- 推荐用正则字面量写法,不需要额外处理转义,出错概率更低:
var str='[{"id":"abcd","pin":5},{"id":"efgh","pin":6}]'; const matchRes = str.match(/{"id":"abcd".*?}/); console.log(matchRes[0]) // 输出:{"id":"abcd","pin":5}
- 如果必须使用
new RegExp构造函数写法,直接把非贪婪标识加上即可:
var str='[{"id":"abcd","pin":5},{"id":"efgh","pin":6}]'; const matchRes = str.match(new RegExp('{"id":"abcd".*?}')); console.log(matchRes[0]) // 输出:{"id":"abcd","pin":5}
匹配原理
.*:贪婪模式,从匹配起始位置开始向后匹配所有字符,直到满足后续匹配规则的最远位置才停止,这也是你之前的正则匹配到整个字符串末尾的原因。.*?:非贪婪模式,从匹配起始位置开始向后匹配,碰到第一个满足后续匹配规则的位置就停止,这里碰到第一个}就终止匹配,刚好能拿到完整的单个对象片段。
注意:如果待匹配的对象内部存在嵌套的
{}结构,上述简单正则会出现匹配错误。这种场景更推荐直接将字符串解析为原生JS结构再查找对应项,鲁棒性远高于正则匹配,示例代码如下:var str='[{"id":"abcd","pin":5},{"id":"efgh","pin":6}]'; const target = JSON.parse(str).find(item => item.id === 'abcd'); console.log(target) // 输出:{id: 'abcd', pin: 5}
内容的提问来源于stack exchange,提问作者The concise
相关产品推荐
相关产品推荐

