我们都知道在js中遇到特殊字符要使用转义字符,但是如果多个转义字符同时出现的话,那又是怎么用的呢,我突发奇想,然后去一个一个的试了一下,最后终于把这个地方搞清楚了。
js中定义正则表达式有两种方法,这两种方法同样的正则表达式但是运行的结果可能是不相同的。
第一种,直接定义法:
var reg1 = /\d/g;
var str = '1';
console.log(reg1.test(str));
//返回true,说明此时reg1匹配的是\d,也就是数字
var reg1 = /\\d/g;
var str = '\\d';
console.log(reg1.test(str));
//返回true,说明此时reg1匹配的是字符串"\\d"
var reg1 = /\\\d/g;
var str = '\\1';
console.log(reg1.test(str));
//返回true,说明此时reg1匹配的是字符串"\\数字"
var reg1 = /\\\\d/g;
var str = '\\\\d';
console.log(reg1.test(str));
//返回true,说明此时reg1匹配的是字符串"\\\d"
第二种:构造函数方式:
var reg2 = new RegExp('\d','g');
var str = 'd';
console.log(reg2.test(str));
//返回true,说明此时reg2匹配的是字符"d"
var reg2 = new RegExp('\\d','g');
var str = '1';
console.log(reg2.test(str));
//返回true,说明此时reg2匹配的是字符"\d",即数字
var reg2 = new RegExp('\\\d','g');
var str = '1';
console.log(reg2.test(str));
//返回true,说明此时reg2匹配的是字符"\d",即数字
var reg2 = new RegExp('\\\\d','g');
var str = '\\d';
console.log(reg2.test(str));
//返回true,说明此时reg2匹配的是字符串"\\d"
var reg2 = new RegExp('\\\\\d','g');
var str = '\\d';
console.log(reg2.test(str));
//返回true,说明此时reg2匹配的是字符串"\\d"
var reg2 = new RegExp('\\\\\\d','g');
var str = '\\1';
console.log(reg2.test(str));
//返回true,说明此时reg2匹配的是字符串"\\数字"
var reg2 = new RegExp('\\\\\\\d','g');
var str = '\\1';
console.log(reg2.test(str));
//返回true,说明此时reg2匹配的是字符串"\\数字"
其实试了这么多,我们已经可以发现规律了,在用构造函数定义正则表达式的方式中,第一个\是表示转义字符,第二个是\本身,第三个又是转义字符,第四个是它本身,将整个字符串解析出来之后,得到的新字符串的意义就跟直接定义中的字符串用法是一样的了。
正则表达式匹配符结果根据解析之后的字符串中转义字符的个数有关,若\的个数为单数,则匹配的时候最后一个反斜杠与d一起匹配数字,前面的反斜杠也要加上。但是如果\的个数为双数,则直接匹配这一串字符串。
其实这个问题乍一看,哇,好多斜杠,好麻烦,但是我们一点一点的去拆开就会发现,其实也没有那么困难,还挺简单的。