如何在JavaScript中替换多行字符串中最后出现的}?

hts6caw3  于 2023-09-29  发布在  Java
关注(0)|答案(3)|浏览(96)

如何在JavaScript中替换多行字符串中最后出现的}?
how to replace last occurrence of a word in javascript?中的方法在多行字符串的情况下不起作用:

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

因为在这种情况下,每个}都被替换了,这是我不希望的。
注意:这不是Replace last occurrence of character in string的重复,因为我的问题是专门关于多行字符串的,而链接的问题不是。

amrnrhlw

amrnrhlw1#

你只需要将修饰符从g(全局)更改为s(单行):

"line1}hello\n}\nline2}abc".replace(/(.*)}/s, "$1");
// "line1}hello\n}\nline2abc"

您根本不需要g,因为您希望执行单个匹配。
默认情况下,正则表达式是每行执行的,但是使用s会将输入字符串视为单行。

j13ufse2

j13ufse22#

你可以使用类似这样的东西:

const str = `line1}hello
}
line2}abc`;

const result = str.replace(/\}(?=[^}]*$)/, '');

console.log(result)

Regex解释:

/\}(?=[^}]*$)/
  • /-启动缓存
  • \}-查找文字结束花括号
  • (?=[^}]*$)-在我前面没有其他的花括号,直到字符串(不是一行)的结尾。
  • /-结束分隔符
  • 注意没有旗帜;重要

通过不使用多行标志/m$表现为字符串结束Meta转义,而不是行尾转义。
https://regex101.com/r/Ausg5r/1
请注意,PCRE对字符串结尾\z有一个专用的Meta转义,但JS没有。

jutyujz0

jutyujz03#

您可以使用/}(?=[^\n]*$)/gm删除每行中的}

const str = "line1}hello\n}\nline2}abc";

const result = str.replace(/}(?![\s\S]*})/, '|');

console.log(result)

这个正则表达式的工作原理是寻找一个}字符,该字符后面没有另一个}字符。

相关问题