当对包含正则表达式元字符的某种组合的字符串使用正则表达式替换函数时,字符串中替换的字符被错误地替换。
我一直在使用以下表达式:
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/
我实际上设法通过以下方式解决了这个问题:
string = string.replace(/[-[]/{}()*+?.\^$|]/g, "[$&]");
由于无论如何我都想匹配角色,所以我可以用方括号将其包围,而不是试图逃避它。
我想这只是我特定版本的IE中Javascript引擎的一个错误,没有什么新鲜事。
作为替换字符串,您指定\$&
.
从理论上讲是可以的,但显然 JavaScript 正则表达式的一些版本 使用$0
作为整个匹配的引用。
我在 regex101.com 下测试了您的正则表达式和替换字符串(JavaScript正则表达式风格( 并发现$0
版本在那里工作。
因此,请尝试将替换字符串更改为\$0
。
另一句话:
在char 类中(在[
和]
之间(,您不需要转义:
- 前导或尾随减号,
- 开方括号 (
[
(, - 大括号和括号 (
{}()
(, - 量词 (
*+?
(, - 一个点,
^
和$
锚,- 竖线。
因此,您可以将正则表达式缩短为[-[]/{}()*+?.\^$|]
。
编辑
看看 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/lastMatch 关于$&
并注意片段:此功能是非标准的,不在标准轨道上。