正则表达式,两种方式,不同的结果。

时间:2015-03-14 17:20:05

标签: javascript regex

这有两种方法来实现某些目标。他们都应该做同样的事情,但他们不会。

代码: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运算符创建正则表达式,第二个函数不是。

2 个答案:

答案 0 :(得分:2)

使用\\s对象时需要使用RegExp

a1 = function(str) {
    return str.replace(new RegExp("[^a-zA-Z0-9\\s]", "gi"), "");
}

否则\ss对象中被解释为文字RegExp

答案 1 :(得分:2)

> console.log("[^a-zA-Z0-9\s]");
"[^a-zA-Z0-9s]"

字符串文字也使用反斜杠作为转义,而无法识别的序列则忽略其反斜杠。转义永远不会进入RegExp构造函数。

当然,正确的做法是始终使用正则表达式文字。但是,如果你需要任何字符串中的文字反斜杠,它也可以被转义。

new RegExp("[^a-zA-Z0-9\\s]", "gi")