为什么这段JavaScript正则匹配JSON字符串返回null,如何解决?
匹配失效原因
- 正则默认规则中,元字符
.不匹配换行符\n,你给出的API响应里JSON结构跨了多行,中间包含大量换行,.*在匹配到第一个{后的换行就停止匹配了,自然找不到符合规则的内容。 - 之前测试用例能生效,是因为此前测试的JSON都是单行无换行的结构,没有触发这个规则限制。
修复方案
这里提供两种可行的实现方式:
方式1:调整正则规则
方案a:添加dotAll修饰符s
给正则加上s修饰符后,元字符.就可以匹配包括换行在内的所有字符,修改后代码如下:
// 直接用正则字面量更简洁,不需要用RegExp构造函数 const matchResult = /{.*}/s.exec(dd); const jsonStr = matchResult ? matchResult[0] : '';
方案b:兼容旧环境的正则写法
如果需要兼容不支持s修饰符的旧JS环境,可以用[\s\S]代替.,\s匹配所有空白字符(含换行)、\S匹配所有非空白字符,二者组合等价于匹配所有字符:
const matchResult = /\{[\s\S]*\}/.exec(dd); const jsonStr = matchResult ? matchResult[0] : '';
方式2:直接截取字符串(更稳妥)
如果确定响应里只有一个完整的顶层JSON结构,不需要用正则,直接通过下标截取字符串更稳定,也不会因为JSON内部嵌套{}出现匹配错误:
const firstBracketIdx = dd.indexOf('{'); const lastBracketIdx = dd.lastIndexOf('}'); // 兜底处理找不到括号的异常情况 const jsonStr = firstBracketIdx > -1 && lastBracketIdx > firstBracketIdx ? dd.slice(firstBracketIdx, lastBracketIdx + 1) : '';
拿到jsonStr之后直接调用JSON.parse()就能拿到JSON对象了。
内容的提问来源于stack exchange,提问作者sigmaxf
相关产品推荐
相关产品推荐

