正则表达式的扩展

语法的修改

在ES6之前定义正则有两种方式

var regex = new RegExp('xyz', 'i');
// 等价于
var regex = /xyz/i;

此时定义正则有了新的改变

ES5不允许此时使用第二个参数,添加修饰符,否则会报错,但是ES6可以了,下面的代码不会报错

var regex = new RegExp(/xyz/, 'i');

如果RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。而且,返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符。

new RegExp(/abc/ig, 'i').flags // "i"

修饰符和属性

u修饰符

ES6对正则表达式添加了u修饰符,含义为“Unicode模式”,用来正确处理大于\uFFFF的Unicode字符。也就是说,会正确处理四个字节的UTF-16编码。

我们看一下u修饰符的作用,比如下面的字符编码是四个字节的'\uD83D\uDC2A',如果没有使用u修饰符

 

 

 

上面的结果返回的是true,是因为进行匹配内部匹配到了就返回true

再看一下u修饰符

 

 返回false是因为全部匹配,根据大于\uFFFF的Unicode字符正确处理

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

 sticky属性

与y修饰符相匹配,ES6的正则对象多了sticky属性,表示是否设置了y修饰符。

 

  flags属性

ES6为正则表达式新增了flags属性,会返回正则表达式的修饰符。

// ES5的source属性
// 返回正则表达式的正文
/abc/ig.source
// "abc"

// ES6的flags属性
// 返回正则表达式的修饰符
/abc/ig.flags
// 'gi'

 

posted @ 2021-10-26 15:54  keyeking  阅读(37)  评论(0编辑  收藏  举报