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'