这有两种方法来实现某些目标。他们都应该做同样的事情,但他们不会。
代码:http://jsfiddle.net/8vjctofs/
a1 = function(str) {
return str.replace(new RegExp("[^a-zA-Z0-9\s]", "gi"), "");
}
a2 = function(str) {
return str.replace(/[^a-zA-Z0-9\s]/gi, "");
}
var string = "abc abc";
console.log(a1(string));
console.log(a2(string));
输出:
abcabc
abc abc
拜托,告诉我为什么?代码是相同的,除了第一个函数通过new运算符创建正则表达式,第二个函数不是。
答案 0 :(得分:2)
使用\\s
对象时需要使用RegExp
:
a1 = function(str) {
return str.replace(new RegExp("[^a-zA-Z0-9\\s]", "gi"), "");
}
否则\s
在s
对象中被解释为文字RegExp
。
答案 1 :(得分:2)
> console.log("[^a-zA-Z0-9\s]");
"[^a-zA-Z0-9s]"
字符串文字也使用反斜杠作为转义,而无法识别的序列则忽略其反斜杠。转义永远不会进入RegExp
构造函数。
当然,正确的做法是始终使用正则表达式文字。但是,如果你需要任何字符串中的文字反斜杠,它也可以被转义。
new RegExp("[^a-zA-Z0-9\\s]", "gi")