欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

正则表达式-y修饰符

程序员文章站 2024-02-20 20:11:29
...

y修饰符

y修饰符和g修饰符是类似的,都是全局匹配,但y修饰符有一定的匹配要求
g修饰符
只要剩余的字符中存在匹配即可

y修饰符
必须从剩余字符的第一个位置开始匹配,否则退出匹配

示例讲解

let str = "aaa_aa_aaaa"
let reg_g = /a+/g
let reg_y = /a+/y

reg_g.exec(str)
// aaa
reg_y.exec(str)
// aaa

reg_g.exec(str)
// aa
reg_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+/g
let reg_y = /a+/y

reg_g.exec(str)
// aaa
reg_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+/y
reg.lastIndex
// 0
reg.lastIndex = 4
reg.lastIndex
// 4
// exec也是通过修改lastIndex来修改匹配的起始位置

lastIndex与y修饰符

通过合理修改lastIndex的值可以在一定情况下是y修饰符不符合常规的匹配成功,同样是上面的例子,在不修改正则表达式的情况下,我们通过lastIndex来使其匹配成功

let str = "_aaa_aa_aaaa"
let reg_y = /a+/y
reg_y.lastIndex = 1
reg_y.exec(str)
// aaa
reg_y.lastIndex = 5
reg_y.exec(str)
// aa
reg_y.lastIndex = 8
reg_y.exec(str)
// aaaaa

总结

y修饰符可以进行全局匹配,且必须从当前匹配的起始位置开始匹配且匹配成功,否则退出匹配