一、正则新特性
(1)正则回顾
-
修饰符
- global -g
- ignoreCase -i
- mutli-line -m
-
元字符
- \w \W word
- \d \D digit [0-9]
- \s \S space \n \r \t \v \f
- \b \B bridge
- . 除了\n \r所有字符
-
贪婪模式
能匹配多,就不匹配少
-
正向预查(先行断言)(先行否定断言)
例:x后面紧跟着y
/x(?=y)/
(2)新增特性
-
声明正则的变化方式
-
传统声明方式
var reg = /xyz/ig var reg = new RegExp('xyz', 'ig'); var reg = new RegExp(/xyz/gi);
-
新增声明方式
var reg = new RegExp(/xyz/gi, 'gm'); // 如果两边都存在修饰符,则以后面为准
-
-
字符串上的正则方法进行了调整:将字符串上的正则方法调整到了正则原型上
RegExp.prototype[Symbol.match]; RegExp.prototype[Symbol.replace]; RegExp.prototype[Symbol.search]; RegExp.prototype[Symbol.split]; // 当字符串调用这些正则方法的时候,实际是调用了正则原型上的方法 console.log(String.prototype.match); console.log(String.prototype.replace); console.log(String.prototype.search); console.log(String.prototype.split);
-
新增的修饰符 y u s
-
y(sticky)粘黏
与g的对比,主要体现在exec:
var str = 'aaa_aa_a'; var reg1 = /a+/g; var reg2 = /a+/y; // 第一次exec console.log(reg1.exec(str));//['aaa',index:0,input:'aaa_aa_a'] console.log(reg2.exec(str));//['aaa',index:0,input:'aaa_aa_a'] // 第二次exec console.log(reg1.exec(str));//['aa',index:4,input:'aaa_aa_a'] console.log(reg2.exec(str));//null
-
u(unicode)
可以识别编码极限以上的字符
-
码点(UTF-16编码):每个码点可以存储两个字节
U+0000 ~ U+D800 是一些常用的字,用两个字节表示一个字符(‘\u20bb7’: 超出了编码极限)
U+D800 ~ U+FFFF 是一些生僻的字,用四个字节表示一个字符(‘\uD842\uDFB7’: 𠮷,也可用’\u{2pbb7}'代替,JS会帮忙解析{}里的内容) -
es5不支持四个字节表示一个字符
console.log(/^\uD83D/.test('\uD83D\uDC2A'))//true es5只能识别D800一下的字符(认为\uD83D是一个字符) console.log(/^\uD83D/u.test('\uD83D\uDC2A'))//false -u可以识别D800以上的字符(认为\uD83D\uDC2A是一个字符)
-
.
修饰符不能匹配超出编码极限的字符var s = '\uD842\uDFB7'; console.log(s); //𠮷 console.log(/^.$/.test(s)); //false 超出了编码极限无法匹配了 console.log(/^.$/u.test(s)); //true
-
-
s
匹配所有
s = dotAll
.可以匹配任何字符包括\n等等特殊,es2018实现了,目前兼容可能有问题,所以用s
console.log(/foo.bar/.test('foo\nbar')); //false console.log(/foo.bar/s.test('foo\nbar')); //true console.log(/foo.bar/s.dotAll); //true
-
-
新增方法
-
查看修饰符是否定义:
var reg = new RegExp('xyz','ig'); console.log(reg.global) true console.log(reg.ignoreCase) true console.log(reg.multiLine) false
-
查看正则主体和修饰符
var reg = /\wabed/giy; console.log(reg.source); // wabed console.log(reg.flags); // giy
-