为什么我需要“$$$"(三美元)如果我想要“$$"(两美元)作为Java中的替换字符串

Why do I need "$$$" (three dollar) if I want "$$" (two dollar) as replace string in Java- / coffescript-

本文关键字:美元 quot Java 作为 字符串 替换 为什么 如果 我想要      更新时间:2023-09-26

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"引用了匹配的组-,但即使中没有regexp

即使没有任何捕获组,也可以在替换字符串中使用$$&表示正则表达式匹配的所有内容,$`表示匹配前的所有内容和$'表示匹配后的所有内容。所以$总是被特殊处理的,而$$意味着只有一个$

原因是$是replace的第二个参数中的一个特殊字符。请参阅中的"将字符串指定为参数"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace

如果我想要"$$"(两美元)作为替换字符串,为什么我需要"$$$"(三美元)

事实上,在替换字符串中需要4个$。要替换为文字$,需要两个$,因为一个$"转义"另一个。

因此,您需要

var a = "some::var";
a = a.replace(/::/g,'$$$$'); // this will replace `::` with `$$`
document.body.innerHTML = a;

如果您添加了一个奇怪的$,它将被视为一个文字,或被省略,或是特定浏览器想用这个"野生"转义符号做的任何事情。因此,在替换模式中使用偶数个$s是更安全的。