有谁知道为什么
"why?? <abc> and <a b c> and <a b>".replace( /<([^>]+)>/g, "\$$1" );
返回
"why?? $1 and $1 and $1"
insted of
"why?? $abc and $a b c and $a b"
没有转义$,结果符合预期
"why?? <abc> and <a b c> and <a b>".replace( /<([^>]+)>/g, "$1" )
//"why?? abc and a b c and a b"
我尝试过各种各样的黑客攻击,包括例如
"why?? <abc> and <a b c> and <a b>".replace( /<([^>]+)>/g, String.fromCharCode( 36 ) + "$1" );
最后我设法使用函数作为替换字符串获取我想要的输出(见下文),但我想知道我做错了什么。提前谢谢。
"why?? <abc> and <a b c> and <a b>".replace( /<([^>]+)>/g, function(m,m1,m2,p){return '$' + m1; } )
答案 0 :(得分:7)
在JavaScript中,只是从无法识别的转义序列中删除反斜杠。 \$
不是字符串文字中可识别的转义序列,因此:
"\$$1"
与此相同:
"$$1"
并且在replace
替换字符串中,$$
表示“字面上的美元符号”。
你想要的是这个:
"$$$1"
$$
变为$
且$1
变为例如abc
replace
。
(换句话说:你在{{1}}替换字符串中“逃避”美元符号的方式是将其加倍,不,前缀为反斜杠。)