2016-04-22 136 views
3

我试图用JavaScript中的正则表达式替换文件名中的非法字符,但它在IE 11中以'正则表达式中的语法错误'持续下降。在Chrome和Edge中,相同的代码工作正常。JavaScript正则表达式在IE中失败,但在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'), '_'); 

希望的输出是

filename = 'test_&_this_again.2016.txt'; 

任何帮助,将不胜感激。

感谢

+0

旁边的问题:你的'replaceAll'函数的目的是什么,因为它只是调用标准'replace'函数? – sp00m

+0

FWIW:'/ [^ a-zA-Z0-9 _ \ - &。] + /'与'/ [^ \ w \ - &。] + /' –

+0

相同我希望你不要泄露' .replaceAll'到生产代码:-O – andlrc

回答

5

的一点是,RegExp构造接受你看到正则表达式的文本对象是不是在所有的浏览器都支持。使用通用代码:

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

对于其工作始终。当浏览器开始与ES6相符时,不会有使用构造函数中的正则表达式的文本对象(source: MDN)任何麻烦:

与ECMAScript的6起,new RegExp(/ab+c/, 'i')不再抛出一个类型错误( “当从另一个构建一个RegExp时,不能提供标志”),当第一个参数是RegExp并且第二个标志参数存在时。而是从参数中创建一个新的RegExp

另外,我建议使用正则表达式文字符号因为模式没有动态生成。以下是来自MDN的推荐:

文字表示法提供了在计算表达式时编译正则表达式。在正则表达式保持不变时使用文字符号...

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

1

双逃逸\\和字符串表示应该这样做:

filename = filename.replaceAll(new RegExp('[^a-zA-Z0-9_\\-&.]+', 'g'), '_'); 
+0

这些实际上是单引号,但是,我会建议同样的事情。将正则表达式传递给RegExp构造函数在技术上一直不正确;也许IE 11是唯一一个强制执行该规则的人。 –

+1

如果放置在字符类的末尾,则不需要转义连字符。 –

相关问题