JavaScript replace()方法中的美元符号

19

我有一个字符串,像 aman/gupta,我想将其替换为aman$$gupta,我使用JavaScript中的replace方法如下:

let a = "aman/gupta"
a = a.replace("/", "$")
console.log(a) // 'aman$gupta'

a = "aman/gupta"
a = a.replace("/", "$$")
console.log(a) // 'aman$gupta'

a = "aman/gupta"
a = a.replace("/", "$$$")
console.log(a) // 'aman$$gupta'

当我使用$$$而不是$$时,为什么第一种和第二种情况相同,并且我得到了预期的结果?


9
$$是在.replace()中用于替换字符串时的一种“特殊值”。请参考此处 - Andreas
可能是string.replace的重复问题,当使用美元符号($)作为替换时出现奇怪的行为。 - Bergi
6个回答

29

这是因为$$会插入字面量"$"。

所以,您需要使用:

a = "aman/gupta";
a = a.replace("/", "$$$$"); // "aman$$gupta"

请参阅以下特殊模式

模式 插入值
$$ 插入一个字符 "$"。
$& 插入匹配的子字符串。
$` 插入被匹配子字符串之前的部分字符串。
$' 插入被匹配子字符串之后的部分字符串。
$n 其中 n 是 0 到 99 的非负整数,如果第一个参数是 RegExp 对象,则插入第 _n_ 个圆括号匹配的子串。
$<Name> 其中 Name 是一个捕获组名称。如果该组未在匹配中,或者未出现在正则表达式中,或者如果传递给 replace 的第一个参数是字符串而不是正则表达式,则其解析为文字(例如,"<Name>")。

12
为避免需要转义特殊字符,您可以使用匿名函数作为替换器。
a = "aman/gupta";
a = a.replace("/", function() {return "$$"});
console.log(a); // "aman$$gupta"

String.prototype.replace()文档

指定函数作为参数

您可以将函数指定为第二个参数。在这种情况下,当匹配完成后,该函数将被调用。函数的结果(返回值)将用作替换字符串。(注意:上述特殊替换模式在此情况下不适用。)请注意,如果第一个参数中的正则表达式是全局的,则每个完整匹配要替换都将多次调用该函数。


8

另外,您可以使用 splitjoin 来提高性能,并且对于这些函数来说,$ 不是特殊字符。

var a = "aman/gupta"
a = a.split('/').join('$$')
alert(a); // "aman$$gupta"

2
这并没有回答问题,但这可能是实现相同结果的更好方法。 - dakab
是的,这比替换函数要好得多。 - frogDoraTheRollerskatingFedora

0

replace 方法提供以美元符号开头的替换模式。其中之一是$$,它插入单个$。替换字符串中的单个美元符号将导致文字上的一个美元符号。

因此,如果您想要干净的文本上的美元符号,请相应地使用$$替换模式:

console.log('aman/gupta'.replace('/','$$')); // aman$gupta
console.log('aman/gupta'.replace('/','$$$$')); // aman$$gupta
console.log('aman/gupta'.replace('/','$$$$$$')); // aman$$$gupta

-1
在正则表达式中,如果替换是一个变量,则需要使用美元符号进行转义。否则会出现错误。
function escapeDollarSign(str) {
return str.replace(/\$/g, "$$$$")
}

-2

使用以下代码,它对我有效。

var dollar = "$$$$";
console.log('abhishe/kadam'.replace('/', dollar.replace(new RegExp('\\$', 'g'), '$$$')));

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