Javascript正则表达式在IE中失败,但在Chrome和Edge中运行

Mat*_*att 9 javascript regex

我试图用javascript中的正则表达式替换文件名中的非法字符,但它在IE 11中不断出现"正则表达式中的语法错误".相同的代码在Chrome和Edge中运行良好.

String.prototype.replaceAll = function (search, replacement) {
     var target = this;
     return target.replace(search, replacement);
};

var filename = 'test+&+this+again.2016.txt';

filename = filename.replaceAll(new RegExp(/[^a-zA-Z0-9_\-&.]+/, 'g'), '_');
Run Code Online (Sandbox Code Playgroud)

期望的输出是

filename = 'test_&_this_again.2016.txt';
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

谢谢

Wik*_*żew 9

关键是RegExp你所看到的所有浏览器都不支持接受正则表达式文字对象的构造函数.使用这样的通用代码:

filename = 'test+&+this+again.2016.txt'; 
filename = filename.replace(/[^a-zA-Z0-9_&.-]+/g, '_');
document.body.innerHTML = filename;
Run Code Online (Sandbox Code Playgroud)

让它始终如一地工作.当浏览器开始遵守ES6时,在构造函数中使用正则表达式文字对象会没有任何问题(来源:MDN):

从ECMAScript 6开始,new RegExp(/ab+c/, 'i')RegExp当第一个参数为a RegExp且第二个flags参数存在时,不再抛出TypeError("当从另一个构造一个时不能提供标志").RegExp而是创建参数中的新内容.

此外,我建议使用正则表达式文字表示法,因为模式不是动态构建的.以下是MDN的建议:

文本表示法在计算表达式时提供正则表达式的编译.当正则表达式保持不变时使用文字表示法...

正则表达式对象的构造函数(例如new RegExp('ab+c'))提供正则表达式的运行时编译.当您知道正则表达式模式将要更改时,或者您不知道该模式并从其他源(例如用户输入)获取该模式时,请使用构造函数.