如何在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
相关产品推荐
相关产品推荐

