You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么这段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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:15:01