课程名称:再学JavaScript ES(6-10)全版本语法大全
课程章节:2-28 Regexp Sticky(y修饰符)
课程讲师:快乐动起来呀
课程内容:
ES6 为正则表达式添加了y修饰符,叫做“粘连”(sticky)修饰符
y修饰符的作用是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始
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_"]
上面代码每次匹配,都是从剩余字符串的头部开始
y修饰符号隐含了头部匹配的标志^
/b/y.exec('aba')
// null
上面代码由于不能保证头部匹配,所以返回null。y修饰符的设计本意,就是让头部匹配的标志^在全局匹配中都有效
下面是字符串对象的replace方法的例子
const REGEX = /a/gy;
'aaxa'.replace(REGEX, '-') // '--xa'
上面代码中,最后一个a因为不是出现在下一次匹配的头部,所以不会被替换
单单一个y修饰符对match方法,只能返回第一个匹配,必须与g修饰符联用,才能返回所有匹配
'a1a2a3'.match(/a\d/y) // ["a1"]
'a1a2a3'.match(/a\d/gy) // ["a1", "a2", "a3"]
y修饰符的一个应用,是从字符串提取 token(词元),y修饰符确保了匹配之间不会有漏掉的字符
tokenize(TOKEN_Y, '3x + 4')
// [ '3' ]
tokenize(TOKEN_G, '3x + 4')
// [ '3', '+', '4' ]
上面代码中,g修饰符会忽略非法字符,而y修饰符不会,这样就很容易发现错误
课程收获:
y修饰符的作用是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始,y修饰符为了确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的涵义