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

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


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

RegExp构造函数的方式——第一个参数是字符串,第二个参数是修饰符

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

RegExp构造函数的方式——第一个参数是正则表达式,第二个参数不允许设值,否则会报错  

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

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修饰符联用,才能返回所有匹配。

y修饰符与match()方法

        3.6  y修饰符与split()方法

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

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

sticky属性表示正则表达式是否具有y修饰符

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

ES6新增属性flags属性返回正则表达式的修饰符

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容