为什么 'ABC' 替换 'B' 为 '$`' 后得到的结果是 AAC?

70
为什么这段代码输出的是 AAC 而不是预期的 A$`C
console.log('ABC'.replace('B', '$`'));

==>

AAC

如何使其产生预期结果?


6
这个功能非常标准。文档中描述的属性是非标准的。 - Bergi
不太确定,因为它说:**`RegExp.$``是此属性的别名**。 - anubhava
2
@anubhava: "RegExp.$" 属性是非标准的。在替换字符串中使用 "$" 是标准的。 - nhahtdh
1
跟进问题:有人知道为什么用反斜杠 \ 转义 $ 不能产生正确的结果(即 "$`")吗? - fspinnenhirn
2
@greenSocksRock 因为由于某种原因它被第二个 $ 转义了。 - OJFord
显示剩余8条评论
2个回答

71
要插入一个字面上的 $,你需要传递 $$,因为 $`

插入匹配子串之前的字符串部分。

console.log('ABC'.replace('B', "$$`"));

请参阅文档
其他样式:
模式 | 插入值 -- | -- `$$` | 插入一个 `$` 符号。 `$&` | 插入匹配的子字符串。 `$`` | 插入匹配子字符串前面的部分。 `$'` | 插入匹配子字符串后面的部分。 `$n` | 其中 `n` 是小于 100 的正整数,插入第 `n` 个括号内匹配的子字符串。注意这是从 `1` 开始计数的。如果第 `n` 组没有匹配(例如,如果组是 3),它将被替换为一个字面量(例如,`$3`)。 `$` | 其中 `Name` 是捕获组名称。如果该组不在匹配中,或者不在正则表达式中,或者如果传递给 `replace` 的第一个参数是字符串而不是正则表达式,则此选项将解析为字面量(例如,`$`)。仅在支持命名捕获组的浏览器版本中可用。

JSFiddle

此外,在我发布的参考链接中还有更多的内容。如果你仍然有任何问题或疑问,可能可以在那里找到答案。上面的截图是从答案开始时发布的链接中获取的。

值得一提的是,在我看来,任何不匹配上述模式的模式都不需要转义,因此$不需要转义,同样的情况也发生在$AAA上。

在上面的评论中,一个用户问为什么需要用另一个$“转义”$:尽管我不确定这一点,但我认为从我们上面所说的来看,任何无效的模式都不会被解释,因此我认为(并怀疑)$$是一个非常特殊的情况,因为它涵盖了你需要用一个紧随其后的美元符号替换匹配的情况,例如反引号(`)作为一个例子(或者真正的&作为另一个例子)。

在其他情况下,美元符号不需要转义,因此他们决定创建这样一个特定的规则可能是有道理的,否则你就需要在其他所有地方转义$(我认为这可能对任何字符串对象都会产生影响,因为这意味着即使在var a = "hello, $ hey this one is a dollar";中,你也需要转义$)。
如果你仍然感兴趣并想阅读更多,请查看regular-expressions.info和这个带有更多案例的JSFiddle

46
在替换中,美元符号$具有特殊含义,当需要使用匹配数据在替换中时,可以使用它。
参考链接: MDN: String.prototype.replace(): Specifying a string as a parameter

$$ 插入 "$".
$` 插入匹配子串之前的部分字符串。

只要$不会生成特殊的组合,那么它就只会被视为普通字符。但是,你应该始终将其写成$$,以防将来添加新的$x组合导致替换失败。

2
$符号本身不会引起这种行为,只有$加反引号的组合才会。 - exebook
1
@exebook 单独使用“$”不会有问题。但是“$”仍然具有特殊意义,类似于“-”(即 “[a-f]”和“[af-]”之间的区别)。 - t.niese

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接