ES6中在正则表达式中,新增了许多新的特性和一些新的API
一、RegExp构造函数
1.在 ES5 中,RegExp构造函数的参数有两种情况。
1.1 第一种情况是,第一个参数是字符串,第二个参数是表示正则表达式的修饰符(flag)
1.2 第二种情况是,参数是一个正则表示式,这时会返回一个原有正则表达式的拷贝。
RegExp构造函数的参数是一个正则表达式的时候,ES5 不允许此时使用第二个参数添加修饰符,否则会报错。
2. ES6 改变了这种行为(第一个参数是正则表达式的情况)。在ES6中,RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。而且,返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符。
二、U修饰符
ES6 对正则表达式添加了u修饰符,含义为“Unicode 模式”,用来正确处理大于\uFFFF的 Unicode 字符。也就是说,会正确处理四个字节的 UTF-16 编码。
上面代码中,\uD83D\uDC2A是一个四个字节的 UTF-16 编码,代表一个字符。但是,ES5 不支持四个字节的 UTF-16 编码,会将其识别为两个字符,导致第二行代码结果为true。加了u修饰符以后,ES6 就会识别其为一个字符,所以第一行代码结果为false。
一旦加上u修饰符号,就会修改下面这些正则表达式的行为。
2.1 点字符
点(.)字符在正则表达式中,含义是除了换行符以外的任意单个字符。对于码点大于0xFFFF的 Unicode 字符,点字符不能识别,必须加上u修饰符。
2.2 Unicode 字符表示法
ES6 新增了使用大括号表示 Unicode 字符,这种表示法在正则表达式中必须加上u修饰符,才能识别当中的大括号,否则会被解读为量词。
2.3量词
使用u修饰符后,所有量词都会正确识别码点大于0xFFFF的 Unicode 字符。
2.4 U修饰符可以正确返回字符串的长度
2-4-1 length属性读取长度是每两个字节当做长度1,所以在默认情况下,对于大于\uFFFF的Unicode字符会识别为长度2,这显然不符合我们的条件。
2-4-2 在u修饰符下,对于大于\uFFFF的Unicode字符会正确识别为长度1,符合我们预期的要求
三、 y 修饰符(“粘连”修饰符)
3.1 ES6 还为正则表达式添加了y修饰符,叫做“粘连”(sticky)修饰符。
3.2 y修饰符的作用与g修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同之处在于,g修饰符只要剩余位置中存在匹配就可,而y修饰符确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的涵义。
上面代码有两个正则表达式,一个使用g修饰符,另一个使用y修饰符。这两个正则表达式各执行了两次,第一次执行的时候,两者行为相同,剩余字符串都是_aa_a。由于g修饰没有位置要求,所以第二次执行会返回结果,而y修饰符要求匹配必须从头部开始,所以返回null。
3.3 使用lastIndex属性,可以更好地说明y修饰符
3.3.1 改变lastIndex属性的值,对于正则修饰符g的影响。
3.3.2 改变lastIndex属性的值,对于正则修饰符y的影响。
3.3.3 总结一下:其实y修饰符号隐含了头部匹配的标志^。y修饰符的设计本意,就是让头部匹配的标志^在全局匹配中都有效。
3.4 y修饰符与正则的replace()方法
3.4.1 y修饰符和其他修饰符一起作用正则表达式的时候,修饰符的顺序对结果无影响
3.4.2 在replace()方法中,y修饰符在g修饰符下可以匹配所有的结果
3.5 y修饰符与match()方法
单单一个y修饰符对match方法,只能返回第一个匹配,必须与g修饰符联用,才能返回所有匹配。
3.6 y修饰符与split()方法
3.7 y修饰符的一个应用,是从字符串提取 token(词元),y修饰符确保了匹配之间不会有漏掉的字符。
上面代码中,如果字符串里面没有非法字符,y修饰符与g修饰符的提取结果是一样的。但是,一旦出现非法字符,两者的行为就不一样了。
上面代码中,g修饰符会忽略非法字符,而y修饰符不会,这样就很容易发现错误。
四、s修饰符:dotAll 模式 提案阶段
正则表达式中,点(.)是一个特殊字符,代表任意的单个字符,但是行终止符(line terminator character)除外。以下四个字符属于”行终止符“。
1.U+000A 换行符(\n)
2.U+000D 回车符(\r)
3.U+2028 行分隔符(line separator)
4.U+2029 段分隔符(paragraph separator)
例如:
但是,很多时候我们希望匹配的是任意单个字符,这时有几种变通的写法。
s修饰符相当于是给.这个特殊的字符增加‘功力’的,让他能够匹配到任意的单个字符,但是目前还属于提案阶段。
s修饰符还引入了一个dotAll属性,返回布尔值,验证该正则表达式是否处在dotAll模式。
五、sticky属性
ES6 的正则对象多了sticky属性,表示是否设置了y修饰符。
六、flags属性
ES6 为正则表达式新增了flags属性,会返回正则表达式的修饰符。
ES6关于正则的扩展其实还有一些其他的新特性,例如具名组匹配,后行断言,但由于都还处于提案中,因此就不细说下去