【问题标题】:JavaScript regex strange behaviourJavaScript 正则表达式奇怪的行为
【发布时间】:2012-10-12 19:44:34
【问题描述】:

我已经简化了我遇到的问题。
如果我在 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 中的字符串?

【问题讨论】:

  • 抱歉,预期的输出应该是 $&bacba

标签: javascript regex


【解决方案1】:

如果您想在替换字符串中使用$,您需要使用$$ 对其进行转义。 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$&

【讨论】:

  • 感谢您的回答。除了手动执行此操作之外,还有其他方法可以逃避$ 吗?例如。如果变量a 中的内容是从外部资源加载的。
  • @PatrickSchmidt,当然,使用正则表达式替换! a = a.replace(/\$/g, '$$$$');.
  • 链接的文档是特定于 Firefox 的,但是,OP 说浏览器是 Chrome。这些文档与此特定主题相关,但并非链接文章中的所有内容都可以在 Chrome 中使用。 (只是说)
  • 或者,如果您担心所有$ 字符的外观,您可以将String.prototype.splitArray.prototype.join 结合使用:a = a.split('$').join('$$');
  • @Cyborgx37,MDN 的基于 wiki 的文档以非常兼容跨浏览器而闻名。
【解决方案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);

编辑:忘记了全局替换字符。已添加。

【讨论】:

    【解决方案3】:

    两个问题:

    (1)如果要替换所有出现,那么需要使用/g修饰符

    (2) 正则表达式中的字符串$& 具有模式匹配的含义,所以你自己替换了匹配

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 2013-07-13
      • 2012-03-02
      • 1970-01-01
      相关资源
      最近更新 更多