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

时间:2015-11-25 16:49:05

标签: javascript regex

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'对匹配组的引用 - 但即使没有正则表达式

3 个答案:

答案 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"逃避符号。因此,在替换模式中使用偶数个$更安全。