ES6学习总结之 正则表达式
整体来说,ES6对正则表达式的更新和改变不多也不难,下面简单总结于下
1.RegExp构造函数
ES5 RegExp构造函数只能接受字符串作为参数,而ES6中,其可以接受正则表达式作为参数
var reg = new RegExp(/xyz/i)
如果使用RegExp的构造函数的第二个参数指定修饰符,那么返回的正则表达式会忽略其原有的的修饰符
2.字符串的正则方法
字符串的四个可以使用正则表达式的方法:match(),replace(),search(),split(),ES6中在语言内部都调用了RegExp的实例方法,
从而做到所有与正则相关的方法都定义在RegExp对象上
3.u修饰符
ES6中的u修饰符专门用来正确处理大于 \uFFFF的Unicode字符,可以正确的处理4个字节的UTF-16编码
/^\uD83D/u.test('\uD83D\uDC2A') // false /^\uD83D/.test('\uD83D\uDC2A') // true
上述代码中,test内的内容是一个4字节的UTF-16编码,代表一个字符。由于ES5不支持4字节的UTF-16编码,会将其识别为2个字符,导致第二行匹配成功,结果为true;
而第一行,加了u修饰符,ES6就会将其识别为一个字符,所以匹配不成功,结果为false。
3.1 点字符
点字符在正则表达式中表示除了换行符以外的任意单个字符,对于码点 大于0xFFFF的unicode字符,点字符不能识别,必须加上u修饰符
var s = "𠮷" /^.$/.test(s) //false /^.$/u.test(s) //true
3.2 量词
使用u修饰符后,所有的量词都会正确的识别大于0xFFFF的Unicode字符
/𠮷{2}/.test('𠮷𠮷') //false /𠮷{2}/u.test('𠮷𠮷') //true
3.3 预定义模式
u修饰符也影响到预定义模式能否正确识别码点 大于0xFFFF的unicode字符
/^\S$/.test('𠮷') //false /^\S$/u.test('𠮷') //true
3.4 i修饰符
有些Unicode字符编码不同,但是字型很接近,比如 \u004B 和 \u212A 都是大写的K,不加u修饰符,就无法识别非规范的K字符
/[a-z]/i.test('\u212A') //false /[a-z]/iu.test('\u212A') //true
4.y修饰符
ES6新增加了y修饰符,叫做黏连修饰符(sticky)。
y修饰符和g修饰符类似,也是全局匹配,后一次匹配都从第一次匹配成功的下一个位置开始。不同之处在于,g修饰符只要剩余位置中存在匹配就行,而y修饰符会确保匹配必须从剩余的第一个位置开始,
这就是黏连的意思
var s = "bbb_bb_b" var p1 = /b+/g var p2 = /b+/y p1.exec(s) = ["bbb"] p2.exec(s) = ["bbb"] p1.exec(s) = ["bb"] p2.exec(s) = null
5.sticky属性
与y修饰符相匹配,ES6的正则对象多了sticky属性,表示是否设置了y修饰符
var r = /hello\d/y r.sticky = true
6.flags属性
ES6为正则表达式新增了flags属性,会返回正则表达式的修饰符
/dss/ig.flags //'gi'