ES6 正则表达式扩展

一、新增 flags 属性

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

1、ES5 的 source 属性

返回正则表达式的正文

/abc/ig.source
// "abc"

2、ES6 的 flags 属性

返回正则表达式的修饰符

/abc/ig.flags
// 'gi'

二、构造函数的变化

在 ES5 中, RegExp 构造函数的参数有两种情况:

1、参数是字符串,i 为修饰符

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

2、参数是一个正则表示式,i 为修饰符

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

但 ES5 不允许这种情况使用第二个参数添加修饰符

var regex = new RegExp(/xyz/, 'i');
// Uncaught TypeError: Cannot supply flags when constructing one RegExp from another

ES6 改变了这种行为,若 RegExp 构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符
而且,第二个修饰符参数会覆盖原有的正则表达式的修饰符

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

三、新的修饰符

1、u 修饰符

ES6 对正则表达式新增了 u 修饰符,含义为“Unicode 模式”,用来正确处理大于 \uFFFF 的 Unicode 字符

/^\uD83D/.test('\uD83D\uDC2A') // true
/^\uD83D/u.test('\uD83D\uDC2A') // false

上面代码中,\uD83D\uDC2A 是一个四个字节的 UTF-16 编码,代表一个字符

但 ES5 不支持四个字节的 UTF-16 编码,会将其识别为两个字符,导致第一行代码结果为true

加了 u 修饰符以后,ES6 将其识别其为一个字符,所以第二行代码结果为 false

关于点字符
点(.)字符在正则表达式中表示除了换行符以外的任意单个字符
但对于码点大于 0xFFFF 的 Unicode 字符,点字符不能识别,必须加上 u 修饰符

let a = '\ud83d\udc36';
console.log(/^.$/.test(a)); // false
console.log(/^.$/u.test(a)); // true

2、y 修饰符

ES6 为正则表达式新增了 y 修饰符 → “粘连”(sticky)修饰符

其作用与 g 修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始

不同之处在于,g 修饰符只要剩余位置中存在匹配就可,而 y 修饰符确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的涵义

var s = 'aaa_aa';
var r1 = /a+/g;

r1.exec(s) // ["aaa"]
r1.exec(s) // ["aa"]

上面代码使用 g 修饰符,执行第一次后剩余字符串为 _aa,由于 g 修饰符没有位置要求,所以第二次执行返回 aa

var s = 'aaa_aa';
var r2 = /a+/y;

r2.exec(s) // ["aaa"]
r2.exec(s) // null

上面代码使用 y 修饰符,执行第一次后剩余字符串为 _aa,由于 y 修饰符要求匹配必须从头部开始,所以返回null
如果改一下正则表达式,保证每次都能头部匹配,y 修饰符就能返回结果了:

var s = 'aaa_aa_a';
var r3 = /a+_/y;

r3.exec(s) // ["aaa_"]
r3.exec(s) // ["aa_"]
posted @ 2019-07-14 16:42  Leophen  阅读(237)  评论(0编辑  收藏  举报