ES6语法——正则表达式的新特性

ES6中在正则表达式中,新增了许多新的特性和一些新的API

一、RegExp构造函数    
        1.在 ES5 中,RegExp构造函数的参数有两种情况。
            1.1 第一种情况是,第一个参数是字符串,第二个参数是表示正则表达式的修饰符(flag)

《ES6语法——正则表达式的新特性》 RegExp构造函数的方式——第一个参数是字符串,第二个参数是修饰符

            1.2 第二种情况是,参数是一个正则表示式,这时会返回一个原有正则表达式的拷贝。
RegExp构造函数的参数是一个正则表达式的时候,ES5 不允许此时使用第二个参数添加修饰符,否则会报错。

《ES6语法——正则表达式的新特性》 RegExp构造函数的方式——第一个参数是正则表达式,第二个参数不允许设值,否则会报错  

        2. ES6 改变了这种行为(第一个参数是正则表达式的情况)。在ES6中,RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。而且,返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符。

《ES6语法——正则表达式的新特性》 ES6中RegExp()的新特性

二、U修饰符
        ES6 对正则表达式添加了u修饰符,含义为“Unicode 模式”,用来正确处理大于\uFFFF的 Unicode 字符。也就是说,会正确处理四个字节的 UTF-16 编码。

《ES6语法——正则表达式的新特性》

        上面代码中,\uD83D\uDC2A是一个四个字节的 UTF-16 编码,代表一个字符。但是,ES5 不支持四个字节的 UTF-16 编码,会将其识别为两个字符,导致第二行代码结果为true。加了u修饰符以后,ES6 就会识别其为一个字符,所以第一行代码结果为false。
        一旦加上u修饰符号,就会修改下面这些正则表达式的行为。
       2.1 点字符 
        点(.)字符在正则表达式中,含义是除了换行符以外的任意单个字符。对于码点大于0xFFFF的 Unicode 字符,点字符不能识别,必须加上u修饰符。

《ES6语法——正则表达式的新特性》

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

《ES6语法——正则表达式的新特性》

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

《ES6语法——正则表达式的新特性》

        2.4  U修饰符可以正确返回字符串的长度

《ES6语法——正则表达式的新特性》

       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修饰符确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的涵义。

《ES6语法——正则表达式的新特性》

        上面代码有两个正则表达式,一个使用g修饰符,另一个使用y修饰符。这两个正则表达式各执行了两次,第一次执行的时候,两者行为相同,剩余字符串都是_aa_a。由于g修饰没有位置要求,所以第二次执行会返回结果,而y修饰符要求匹配必须从头部开始,所以返回null。
        3.3 使用lastIndex属性,可以更好地说明y修饰符
            3.3.1 改变lastIndex属性的值,对于正则修饰符g的影响。

《ES6语法——正则表达式的新特性》

            3.3.2 改变lastIndex属性的值,对于正则修饰符y的影响。

《ES6语法——正则表达式的新特性》

            3.3.3  总结一下:其实y修饰符号隐含了头部匹配的标志^。y修饰符的设计本意,就是让头部匹配的标志^在全局匹配中都有效。
        3.4  y修饰符与正则的replace()方法

《ES6语法——正则表达式的新特性》

            3.4.1 y修饰符和其他修饰符一起作用正则表达式的时候,修饰符的顺序对结果无影响
            3.4.2  在replace()方法中,y修饰符在g修饰符下可以匹配所有的结果
        3.5  y修饰符与match()方法
        单单一个y修饰符对match方法,只能返回第一个匹配,必须与g修饰符联用,才能返回所有匹配。

《ES6语法——正则表达式的新特性》 y修饰符与match()方法

        3.6  y修饰符与split()方法

《ES6语法——正则表达式的新特性》 y修饰符与split()方法

        3.7 y修饰符的一个应用,是从字符串提取 token(词元),y修饰符确保了匹配之间不会有漏掉的字符。
        

《ES6语法——正则表达式的新特性》

        上面代码中,如果字符串里面没有非法字符,y修饰符与g修饰符的提取结果是一样的。但是,一旦出现非法字符,两者的行为就不一样了。

《ES6语法——正则表达式的新特性》

    上面代码中,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)
        例如:

《ES6语法——正则表达式的新特性》 点.字符不能匹配终止符 就是换行符 回车符这类的

        但是,很多时候我们希望匹配的是任意单个字符,这时有几种变通的写法。

《ES6语法——正则表达式的新特性》 常见的几种匹配任意单个字符的写法
《ES6语法——正则表达式的新特性》 s修饰符处于提案阶段

        s修饰符相当于是给.这个特殊的字符增加‘功力’的,让他能够匹配到任意的单个字符,但是目前还属于提案阶段。
        s修饰符还引入了一个dotAll属性,返回布尔值,验证该正则表达式是否处在dotAll模式。

        五、sticky属性
        ES6 的正则对象多了sticky属性,表示是否设置了y修饰符。

《ES6语法——正则表达式的新特性》 sticky属性表示正则表达式是否具有y修饰符

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

《ES6语法——正则表达式的新特性》 ES6新增属性flags属性返回正则表达式的修饰符

ES6关于正则的扩展其实还有一些其他的新特性,例如具名组匹配,后行断言,但由于都还处于提案中,因此就不细说下去

    原文作者:斜杠工坊
    原文地址: https://www.jianshu.com/p/005fb5ef8dae
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞