JavaScript正则表达式奇怪的行为

时间:2012-10-12 19:44:35

标签: javascript regex

我简化了遇到的问题 如果我在Chrome中执行以下代码,我会遇到一个奇怪的行为:

var a = "$&";
var b = "aba";

var c = b.replace(/a/, a);

console.log(c); // expected output is: "$&b$&"
                // but output is:      "aba"

但如果我执行以下代码,我会得到预期的输出

var a = "c";
var b = "aba";

var c = b.replace(/a/, a);

console.log(c); // expected output is: "cbc"
                // and output is:      "cbc"

有任何想法如何解决这个问题? 这是一个错误吗? 我是否必须在某些方面转义变量a中的字符串?

3 个答案:

答案 0 :(得分:4)

如果要在替换字符串中使用$,则需要使用$$对其进行转义。 The $ character is used as a backreference

var a,
    b,
    c;
a = "$$&";
b = "aba";
c = b.replace(/a/, a);
console.log(c); //$&ba

如果要替换字符串中模式的所有实例,则需要mark the regular expression as being global

var a,
    b,
    c;
a = "$$&";
b = "aba";
c = b.replace(/a/g, a);
console.log(c); //$&b$&

答案 1 :(得分:2)

$是一个反向引用字符。它在替换字符串中具有特殊含义。

见相关问题:
JavaScript - string regex backreferences

或者,更有帮助的是,请访问此页面以获取更详细的文档:
http://www.regular-expressions.info/javascript.html#replace

要修复您的替代品,请尝试:

var a = "$$&";
var b = "aba";

var c = b.replace(/a/g, a);

编辑:忘记全局替换字符。加入。

答案 2 :(得分:0)

两个问题:

(1)如果要替换所有出现的内容,则需要使用/g修饰符

(2)正则表达式中的字符串$&具有模式匹配的含义,因此您自己替换匹配

把它放在一起你需要通过另一个转义美元符号来修改你的代码......>>

var a = "$$&"; 
var b = "aba"; 
var c = b.replace(/a/g, a);