在常规表达式中在替换字符串中插入$

got*_*itz 2 javascript regex

有谁知道为什么

"why?? <abc> and <a b c> and <a b>".replace( /<([^>]+)>/g, "\$$1" ); 
Run Code Online (Sandbox Code Playgroud)

返回

"why?? $1 and $1 and $1"
Run Code Online (Sandbox Code Playgroud)

绝对的

"why?? $abc and $a b c and $a b"
Run Code Online (Sandbox Code Playgroud)

没有转义$,结果如预期

"why?? <abc> and <a b c> and <a b>".replace( /<([^>]+)>/g, "$1" )
//"why?? abc and a b c and a b"
Run Code Online (Sandbox Code Playgroud)

我试过各种各样的黑客,包括例如

"why?? <abc> and <a b c> and <a b>".replace( /<([^>]+)>/g, String.fromCharCode( 36 ) + "$1" );
Run Code Online (Sandbox Code Playgroud)

最后我设法使用函数作为替换字符串获得我想要的输出(见下文),但我想知道我做错了什么.提前致谢.

"why?? <abc> and <a b c> and <a b>".replace( /<([^>]+)>/g, function(m,m1,m2,p){return '$' + m1; } )
Run Code Online (Sandbox Code Playgroud)

rua*_*akh 7

在JavaScript中,反斜杠只是从无法识别的转义序列中删除.\$不是字符串文字中可识别的转义序列,因此:

"\$$1"
Run Code Online (Sandbox Code Playgroud)

意思是这样的:

"$$1"
Run Code Online (Sandbox Code Playgroud)

replace替换字符串中,$$表示"字面上的美元符号".

你想要的是这个:

"$$$1"
Run Code Online (Sandbox Code Playgroud)

其中,$$变得$$1成为如abc.

(换句话说:你在replace替换字符串中"逃避"美元符号的方式是将其加倍,而不是用反斜杠作为前缀.)