正则表达式-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修饰符可以进行全局匹配,且必须从当前匹配的起始位置开始匹配且匹配成功,否则退出匹配
下一篇: Nginx常用模块介绍及配置文件说明