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

Regex, two ways, different results.

本文关键字:结果 方式 两种 正则表达式      更新时间:2023-09-26

这里有两种相同的方法来实现某些东西。他们都应该做同样的事情,但他们没有。

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

在使用对象时需要使用''s RegExp

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

否则,'s 被解释为对象RegExp文字s

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

字符串文本也使用反斜杠作为转义,无法识别的序列的反斜杠将被忽略。转义永远不会到达RegExp构造函数。

当然,正确的做事方法是始终使用正则表达式文字。但是,如果您需要任何字符串中的文字反斜杠,也可以对其进行转义。

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