正则的扩展
新的构造模式
//在ES5中,下列语法是不允许的,而ES6可以实现
var reg = new RegExp(/xyz/,'i');
//如果第二个参数存在,则第一个参数的flag将失效
var reg = new RegExp(/xyz/i,'g') //'/xyz/g'
U修饰符
ES6增加了u修饰符,含义为’Unicode模式’,用来处理大于\uFFFF的Unicode字符,
/^\uD83D/u.test('\uD83D\uDC2A') //false
/^\uD83D/.test('\uD83D\uDC2A') //true
上面的代码中,\uD83D\uDC2A 是一个4字节的 UTF-16 编码,代表一个字符。但是,ES5 不支持 4 字节的 UTF-16 编码,会将其识别为 2 个字符,导致第二行代码结果为 true。 加了 u 修饰符以后, ES6 就会识别其为一个字符,所以第一行代码结果为 false。
Unicode字符表示法
ES6 新增了使用大括号表示 Unicode 字符的表示法,这种表示法在正则表达式中必须加上 u 修饰符才能识别当中的大括号,否则会被解读为量词。
/\ u{61}/.test (’ a ’) //false
/\ u{61}/u.test (’a ’) //true
/\u{20BB7}/u.test('击') //true
量词
使用 u 修饰符后,所有量词都会正确识别码点大于 0xFFFF 的 Unicode 字符。
/击{2}/.test('击击') //false
/击{2}/u.test('击击') //true
y修饰符
除了 u 修饰符, ES6 还为正则表达式添加了 y 修饰符,叫作“粘连”(sticky)修饰符。
y 修饰符的作用与 g 修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一 个位置开始。不同之处在于, g 修饰符只要剩余位置中存在匹配就行,而 y 修饰符会确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的涵义。
var str = 'aaa_aa_a'
var r1 = /a+/g
var r2 = /a+/y
r1.exec(str) //['aaa']
r2.exec(str) //['aaa']
r1.exec(str) //['aa']
r2.exec(str) //['null'],因为第一个匹配的字符是'_'
r2.exec(str) //['aa']
点字符的新特性
正则表达式中,点(.)是一个特殊字符,代表任意的单个字符,但是行终止符(line terminator character)除外。
/foo.bar/.test('foo\nbar') //false
/foo.bar/s.test('foo]nbar') //true
s修饰符被称为dotAll模式,即点代表一切字符。所以,正则表达式引入了dotAll属性,返回布尔值,表示该正则表达式是否处于dotAll模式下。
const re = /foo.bar/s;
re.test('foo\nbar') //true
re.dotAll //true
re.flags //'s'