1、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

上面代码有两个正则表达式,一个使用​​g​​​修饰符,另一个使用​​y​​​修饰符。这两个正则表达式各执行了两次,第一次执行的时候,两者行为相同,剩余字符串都是​​_aa_a​​​。由于​​g​​​修饰没有位置要求,所以第二次执行会返回结果,而​​y​​​修饰符要求匹配必须从头部开始,所以返回​​null​​。

如果改一下正则表达式,保证每次都能头部匹配,​​y​​修饰符就会返回结果了。

var s = 'aaa_aa_a';
var r = /a+_/y;

r.exec(s) // ["aaa_"]
r.exec(s) // ["aa_"]

上面代码每次匹配,都是从剩余字符串的头部开始。 

2、flags 属性

ES6 为正则表达式新增了​​flags​​属性,会返回正则表达式的修饰符。

// ES5 的 source 属性
// 返回正则表达式的正文
/abc/ig.source
// "abc"

// ES6 的 flags 属性
// 返回正则表达式的修饰符
/abc/ig.flags
// 'gi'

​文档​