一、新增 flags 属性
ES6 为正则表达式新增了flags
属性,会返回正则表达式的修饰符。
// ES5 的 source 属性 // 返回正则表达式的正文 /abc/ig.source // "abc"
// 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('uD83DuDC2A') // true /^uD83D/u.test('uD83DuDC2A') // false
上面代码中,uD83DuDC2A
是一个四个字节的 UTF-16 编码,代表一个字符。
但 ES5 不支持四个字节的 UTF-16 编码,会将其识别为两个字符,导致第二行代码结果为true
。
加了u
修饰符以后,ES6 将其识别其为一个字符,所以第一行代码结果为false
。
关于点字符
点(
.
)字符在正则表达式中表示除了换行符以外的任意单个字符。但对于码点大于
0xFFFF
的 Unicode 字符,点字符不能识别,必须加上u
修饰符。let a = 'ud83dudc36'; 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_"]