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

如何在JavaScript多行字符串中替换最后一个}?

多行字符串中替换最后一次出现字符的正确方法

之前用来替换字符串最后一次出现字符的正则方法,在处理多行字符串时会失效——比如用/(.*)}/g尝试替换最后一个},结果会把所有}都删掉:

"line1}hello\n}\nline2}abc".replace(/(.*)}/g, "$1");
// 实际输出:"line1hello\n\nline2abc"

这显然不符合只替换最后一个}的预期。

为什么原方法会失效?

正则里的.默认不匹配换行符,加上全局修饰符g后,(.*)}会逐行匹配每一行的内容到该行最后一个},然后把每一行的}都替换掉,最终导致所有}被移除。

正确解决方案

方案1:使用单行模式(ES2018+)

给正则加上s修饰符,让.匹配包括换行在内的所有字符,同时去掉全局g,只执行一次替换:

const str = "line1}hello\n}\nline2}abc";
const result = str.replace(/(.*)}/s, "$1");
console.log(result);
// 预期输出:"line1}hello\n}\nline2abc"

(.*)}会匹配从字符串开头到最后一个}的全部内容,捕获组$1保留了除最后一个}之外的部分,替换后就只去掉了最后一个目标字符。

方案2:兼容旧环境的写法

如果需要兼容不支持s修饰符的环境,可以用[\s\S](匹配所有空白和非空白字符,等价于任意字符)代替.:

const str = "line1}hello\n}\nline2}abc";
const result = str.replace(/([\s\S]*)}/, "$1");
console.log(result);
// 预期输出:"line1}hello\n}\nline2abc"

本问题与其他相似问题的区别

  • 不是通用的“替换字符最后一次出现”问题:本问题专门针对多行字符串场景,需要处理换行符对正则匹配的影响;
  • 不是单纯的“跨多行正则匹配”问题:核心需求是精准替换最后一次出现的匹配项,而非仅仅实现跨多行匹配。

内容的提问来源于stack exchange,提问作者Basj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:15:56