在正则表达式中的replace字符串中插入$

时间:2012-03-28 11:44:58

标签: javascript regex

有谁知道为什么

"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; } )

1 个答案:

答案 0 :(得分:7)

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

"\$$1"

与此相同:

"$$1"

并且在replace替换字符串中,$$表示“字面上的美元符号”。

你想要的是这个:

"$$$1"

$$变为$$1变为例如abc replace

(换句话说:你在{{1}}替换字符串中“逃避”美元符号的方式是将其加倍,,前缀为反斜杠。)