【问题标题】:IE 11 Javascript regex replace incorrectly replaces meta charactersIE 11 Javascript 正则表达式替换错误地替换元字符
【发布时间】:2018-06-05 15:30:47
【问题描述】:

当对包含一些正则表达式元字符组合的字符串使用正则表达式替换功能时,字符串中被替换的字符被错误地替换。

我一直在使用以下表达式:

string.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&")

这至少在 Chrome 中有效,例如在 JSFiddle 中也可以正常工作,但是在 IE 11(可能是大多数 IE 版本)中,这会错误地将字符替换为不正确的字符,例如:

var string = "test (fake)";
string = string.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");

结果:

test \\(fake\\) 而不是test \(fake\)

我最初以为我可以删除replace() 第二个参数中的一个斜杠,但结果是:

test (fake)

基本上,我似乎无法转义这些字符,因为我不知道如何指定我希望将其替换为字面意义上的\( 而不是(\\(

之前有没有人遇到过这个问题并有解决方案,知道如何解决这个问题或逃避这些字符的其他方法吗?不幸的是,更改浏览器不是一种选择。

这是一个 JSFiddle 供参考以显示它的工作原理:

https://jsfiddle.net/k42uygm8/5/

【问题讨论】:

  • jsfiddle.net/k42uygm8/5 在我的 IE11 中没有打开:( 实际上,我相信你看到的不是你得到的:这可能是“控制台视图”,它显示的是字符串文字而不是文字字符串。
  • 实际上,我在 IE11 中查看的堆栈中使用您的 jsfiddler 示例在此处获得了一个反斜杠。
  • 调试的时候先注意到了;我的正则表达式模式错误并且没有正确匹配。有趣的是,有两个人在 IE 11 中打开它,一个甚至没有打开,一个工作。 lodash 函数似乎会遇到我遇到的同样问题,因为它基本上是一样的。

标签: javascript regex internet-explorer


【解决方案1】:

我实际上设法通过以下方式解决了这个问题:

string = string.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "[$&]");

因为无论如何我都想匹配字符,所以我可以用方括号括起来而不是试图转义它。

我猜这只是我特定版本 IE 中的 Javascript 引擎的一个错误,没有什么新东西。

【讨论】:

    【解决方案2】:

    作为您指定的替换字符串\\$&

    理论上是可以的,但显然是 JavaScript 正则表达式的一些版本 使用$0 作为对整个匹配的引用。

    我在 regex101.com 下测试了你的正则表达式和替换字符串(JavaScript 正则表达式风格) 并发现$0 版本在那里工作。

    所以尝试将替换字符串更改为\\$0

    另说:

    在 char 类中([] 之间)你不需要转义:

    • 前导尾随减号,
    • 打开方括号([),
    • 大括号和圆括号 ({}()),
    • 量词 (*+?),
    • 一个点,
    • ^$ 锚,
    • 垂直条。

    因此您可以将您的正则表达式缩短为[-[\]\/{}()*+?.\\^$|]

    编辑

    看看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/lastMatch 关于$& 并注意以下片段:此功能是非标准的,不在标准轨道上

    【讨论】:

    • 感谢您的建议,我尝试了您的建议,但是我遇到了同样的问题,正在被替换的字符被替换为\\(,用任何字符替换 '(';
    猜你喜欢
    • 2018-07-13
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 2011-02-03
    • 2010-11-12
    • 2016-09-23
    相关资源
    最近更新 更多