有谁知道为什么
"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)
在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替换字符串中"逃避"美元符号的方式是将其加倍,而不是用反斜杠作为前缀.)