语法的修改
在ES6之前定义正则有两种方式
var regex = new RegExp('xyz', 'i'); // 等价于 var regex = /xyz/i;
此时定义正则有了新的改变
ES5不允许此时使用第二个参数,添加修饰符,否则会报错,但是ES6可以了,下面的代码不会报错
var regex = new RegExp(/xyz/, 'i');
如果RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。而且,返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符。
new RegExp(/abc/ig, 'i').flags // "i"
修饰符和属性
u修饰符
ES6对正则表达式添加了u修饰符,含义为“Unicode模式”,用来正确处理大于\uFFFF的Unicode字符。也就是说,会正确处理四个字节的UTF-16编码。
我们看一下u修饰符的作用,比如下面的字符编码是四个字节的'\uD83D\uDC2A',如果没有使用u修饰符
上面的结果返回的是true,是因为进行匹配内部匹配到了就返回true
再看一下u修饰符
返回false是因为全部匹配,根据大于\uFFFF的Unicode字符正确处理
y修饰符
除了u修饰符,ES6还为正则表达式添加了y修饰符,叫做“粘连”(sticky)修饰符。
y修饰符的作用与g修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同之处在于,g修饰符只要剩余位置中存在匹配就可,而y修饰符确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的涵义。
var s = 'aaa_aa_a'; var r1 = /a+/g; var r2 = /a+/y; r1.exec(s) // ["aaa"] r2.exec(s) // ["aaa"] r1.exec(s) // ["aa"] r2.exec(s) // null
sticky属性
与y修饰符相匹配,ES6的正则对象多了sticky属性,表示是否设置了y修饰符。
flags属性
ES6为正则表达式新增了flags属性,会返回正则表达式的修饰符。
// ES5的source属性 // 返回正则表达式的正文 /abc/ig.source // "abc" // ES6的flags属性 // 返回正则表达式的修饰符 /abc/ig.flags // 'gi'