在使用正则表达式替换字符串时,是否有必要对替换字符串进行转义?

3

我想知道在JavaScript的替换操作中,是否有必要转义替换字符串中的某些字符。我的代码如下:

let t = "##links##";
let t2 = t.replace(/##links##/, `{"labels": ["'$'"]}`);
console.log(t2);

控制台输出为:
{"labels": ["'"]}

这相当令人惊讶。然而,我在文档中找不到任何表明需要对替换字符串进行转义的内容。那么这里到底发生了什么?


https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_string_as_a_parameter - Bergi
2个回答

1

您需要将$符号加倍以替换为字面意义的$

let t = "##links##";
let t2 = t.replace(/##links##/, `{"labels": ["'$$'"]}`);
console.log(t2);

请参阅将字符串指定为参数,其中列出了在正则表达式替换部分中所有可能的“特殊”组合。
如果您查看该表格,您会发现$开始了“特殊”序列。因此,它应该以某种方式进行转义。在JS中,美元符号用于转义文字美元符号。 $&是对整个匹配的反向引用,$`插入与匹配子字符串之前的字符串部分,$'插入匹配子字符串之后的字符串部分。$n是对第n组的反向引用。
因此,如果您有一个动态的、用户定义的替换字符串,它不应该有反向引用,那么可以使用

let t = "##links##";
let  rep = `{"labels": ["'$'"]}`;
let t2 = t.replace(/##links##/, rep.replace(/\$/g, '$$$$'));
console.log(t2);


1
你能解释一下为什么吗?替换字符串是否会以任何方式处理?有没有在线资料描述替换内容需要考虑什么? - Mike Lischke
你需要注意的是 $ 这个字符。一旦你用另一个 $ 对它进行转义,替换字符串就会被视为字面字符串。 - Wiktor Stribiżew
谁知道为什么随意的踩票者会投他所投的票呢?我们两个回答在同一时间被踩票了。这里有一个加一 _por vous_。 - bishop

1
美元符号($)在replace中具有特殊意义。如果您想要一个单独的、字面意义上的美元符号,请使用$$。否则,替换字符串可以包括以下特殊替换模式
  • $$ 插入一个 $
  • $& 插入匹配的子字符串。
  • $` 插入匹配的子字符串之前的部分。
  • $' 插入匹配的子字符串之后的部分。
  • $n 其中 n 是小于100的正整数,插入第 n 个括号子匹配字符串,前提是第一个参数是 RegExp 对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接