1.RegExp构造函数

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

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

上面代码中,原有正则对象的修饰符是ig,它会被第二个参数i覆盖。

2.字符串的正则方法

字符串对象共有3个方法可以使用正则表达式:match()、replace()、search()和split()。

3.u修饰符

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

1. 点字符

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

2.Unicode字符表示法

ES6新增了使用大括号表示Unicode字符,这种表示法在正则表达式中必须加上u修饰符,才能识别当中的大括号,否则会被解读为量词。

3.量词

使用u修饰符后,素有量词都会正确识别码点大于0xFFFF的Unicode字符。

4.RegExp.prototype.unicode属性

正则实例对象新增Unicode属性,表示是否设置了u修饰符。

  1. const r1 = /hello/;
  2. const r2 = /hello/u;
  3. r1.unicode; //false
  4. r2.unicode; //true

5.y修饰符

y修饰符就做“粘连”(sticky)修饰符。
y修饰符的作用与g修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同之处在于,g修饰符只要剩余位置中存在匹配就可,而y修饰符确保匹配必须从剩余的第一个位置开始。

  1. var s = 'aaa_aa_a';
  2. var r1 = /a+/g;
  3. var r2 = /a+/y;
  4. r1.exec(s); //["aaa"]
  5. r2.exec(s); //["aaa"]
  6. r1.exec(s); //["aa"]
  7. r2.exec(s); //null

上面代码有两个正则表达式,一个使用g修饰符,另一个使用y修饰符。这两个正则表达式各执行了两次,第一次执行的时候,两者行为相同,剩余字符串都是_aa_a。由于g修饰没有位置要求,所以第二次执行会返回结果,而y修饰符要求匹配从头部开始,所以返回null。

6.RegExp.prototype.sticky属性

表示是否设置了y修饰符。

7.RegExp.prototype.flags属性

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

  1. //ES5的source属性
  2. //返回正则表达式的正文
  3. /abc/ig.source
  4. //"abc"
  5. //ES6的flags属性
  6. //返回正则表达式的修饰符
  7. /abc/ig.flags
  8. //'gi'

8.s修饰符:dotAll模式

行终止符:换行符\n 回车符\r 行分隔符 段分隔符
.无法匹配四个字节的UTF-16字符以及行终止符
ES2018引入s修饰符,使得.可以匹配任意单个字符。

  1. /foo.bar/s.test('foo\nbar') //true

dotAll属性

返回一个布尔值,表示该正则表达式是否处在dotAll模式。

9.后行断言

JS的正则表达式只支持先行断言和先行否定断言,不支持后行断言。ES2018引入后行断言。
先行断言指的是,x只有在y前面才匹配,必须写成/x(?=y)/。先行否定断言指的是,x只有不在y前面才匹配,必须写成/x(?!y)/。
后行断言与先行断言相反,x只有在y后面才匹配,必须写成/(?<=y)x。