Pre:我有自己的库,我在Coffescript中使用命名空间模块和类。这类似于Ruby" namspace :: module :: class",因为' ::'不允许作为班级名称我将Module::ClassName
替换为Module$$ClassName
- > replace(/\$\$/g,'::')
,很好。
现在我努力逆转:replace(/::/g,'$$')
导致Module$ClassName
只有一个美元($)
所以我玩了一下
a="a:a::b:b::c:c"
a.replace(':','$') #-> "a$a::b:b::c:c" clear only first
a.replace(/:/g,'$') #-> "a$a$$b$b$$c$c" better, but wrong we want '::' only
a.replace(/::/g,'$$') #-> "a:a$b:b$c:c" suprise; where is the 2nd Dollar?
a.replace("::",'$$') #-> "a:a$b:b::c:c" try no regexp since dollar has an other meaning? fails only one $
a.replace(/::/g,'\$\$') #-> "a:a$b:b$c:c" ESC the guys? nope
a.replace(/::/g,"\\$\\$") #-> "a:a\$\$b:b\$\$c:c" ESC ESC to get into the deeper?
# and then replace(/\\\$/g,'$') ? overkill
a.replace(/::/g,'$$$') #-> "a:a$$b:b$$c:c" bingo, but why?
# trying more
a.replace(/::/g,'$$$$') #-> "a:a$$b:b$$c:c" 2 get one? one stays alone
a.replace(/::/g,'$$$$$') #-> "a:a$$$b:b$$$c:c" seems so
毕竟,是逻辑(我想知道为什么我之前从未遇到过这个问题)。
所以我认为(确定)' $$'逃到一个' $'因为' $ n'对匹配组的引用 - 但即使没有正则表达式
答案 0 :(得分:3)
即使您没有任何捕获组,也可以在替换字符串中使用$
。 $&
指的是正则表达式匹配的所有内容,$`
表示匹配前的所有内容,$'
表示匹配后的所有内容。因此,$
始终是专门处理的,$$
仅表示一个$
。
答案 1 :(得分:2)
原因是因为$是replace
的第二个参数中的特殊字符。请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace
答案 2 :(得分:1)
如果我想要“$$”(两美元)作为替换字符串,为什么我需要“$$$”(三美元)
实际上,替换字符串中需要4 $
。要替换为文字$
,您需要两个$
s,因为一个$
"转义"另一个。
因此,你需要
var a = "some::var";
a = a.replace(/::/g,'$$$$'); // this will replace `::` with `$$`
document.body.innerHTML = a;

如果你添加一个奇怪的$
,它将被视为文字,或被忽略,或者特定浏览器想要用这个做什么" wild"逃避符号。因此,在替换模式中使用偶数个$
更安全。