y修饰符
y修饰符和g修饰符是类似的,都是全局匹配,但y修饰符有一定的匹配要求
g修饰符
只要剩余的字符中存在匹配即可
y修饰符
必须从剩余字符的第一个位置开始匹配,否则退出匹配
示例讲解
let str = "aaa_aa_aaaa"let reg_g = /a+/glet reg_y = /a+/yreg_g.exec(str)// aaareg_y.exec(str)// aaareg_g.exec(str)// aareg_y.exec(str)// null
从上面的示例我们可以知道:
第第一次 reg_y.exec 的时候,匹配的是“aaa_aa_aaaa”字符,从第一个位置开始匹配并且匹配成功:aaa第二次 reg_y.exec 的时候,匹配的是“_aa_aaaa”字符,从第一个位置 “_” 开始匹配,但匹配不成功,因此退出匹配
示例2
let str = "_aaa_aa_aaaa"let reg_g = /a+/glet reg_y = /a+/yreg_g.exec(str)// aaareg_y.exec(str)// null// reg_y = /_a+/y// reg_y.exec(str) -> _aaa// reg_y.exec(str) -> _aa// reg_y.exec(str) -> _aaaa// reg_y.exec(str) -> null
同样的,第一次 reg_y.exec 的时候,匹配的是“_aaa_aa_aaaa”字符,从第一个位置"_"开始匹配,匹配不成功,因此退出匹配。若希望匹配成功可以将 reg_y = /_a+/y,即可匹配成功
lastIndex
上面我们说了:y修饰符必须从剩余字符的第一个位置开始匹配,否则退出匹配。
那么什么是第一个位置,实际就是 lastIndex 属性,lastIndex属性是正则变量的属性,他规定了匹配的时候的开始位置,通过自定义lastIndex的值可以修改匹配的开始位置
let reg = /a+/yreg.lastIndex// 0reg.lastIndex = 4reg.lastIndex// 4// exec也是通过修改lastIndex来修改匹配的起始位置
lastIndex与y修饰符
通过合理修改lastIndex的值可以在一定情况下是y修饰符不符合常规的匹配成功,同样是上面的例子,在不修改正则表达式的情况下,我们通过lastIndex来使其匹配成功
let str = "_aaa_aa_aaaa"let reg_y = /a+/yreg_y.lastIndex = 1reg_y.exec(str)// aaareg_y.lastIndex = 5reg_y.exec(str)// aareg_y.lastIndex = 8reg_y.exec(str)// aaaaa
总结
y修饰符可以进行全局匹配,且必须从当前匹配的起始位置开始匹配且匹配成功,否则退出匹配