zoukankan      html  css  js  c++  java
  • ES6 正则扩展

    一、新增 flags 属性

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

    // ES5 的 source 属性
    // 返回正则表达式的正文
    /abc/ig.source
    // "abc"
    // ES6 的 flags 属性
    // 返回正则表达式的修饰符
    /abc/ig.flags
    // 'gi'

     

    二、构造函数的变化

    在 ES5 中, RegExp 构造函数的参数有两种情况:

    1、参数是字符串,i 为修饰符

    var regex = new RegExp('xyz', 'i');
    //  等价于 var regex = /xyz/i;

    2、参数是一个正则表示式,i 为修饰符

    var regex = new RegExp(/xyz/i);
    //  等价于 var regex = /xyz/i;

    但 ES5 不允许这种情况使用第二个参数添加修饰符

    var regex = new RegExp(/xyz/, 'i');
    // Uncaught TypeError: Cannot supply flags when constructing one RegExp from another

    ES6 改变了这种行为。若 RegExp 构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。

    而且,第二个修饰符参数会覆盖原有的正则表达式的修饰符

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

    三、新的修饰符

    1、u 修饰符

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

    /^uD83D/.test('uD83DuDC2A') // true
    /^uD83D/u.test('uD83DuDC2A') // false

    上面代码中,uD83DuDC2A 是一个四个字节的 UTF-16 编码,代表一个字符。

    但 ES5 不支持四个字节的 UTF-16 编码,会将其识别为两个字符,导致第二行代码结果为true

    加了u修饰符以后,ES6 将其识别其为一个字符,所以第一行代码结果为false

    关于点字符

    点(.)字符在正则表达式中表示除了换行符以外的任意单个字符。

    但对于码点大于0xFFFF的 Unicode 字符,点字符不能识别,必须加上u修饰符。

    let a = 'ud83dudc36';
    console.log(/^.$/.test(a)); // false
    console.log(/^.$/u.test(a)); // true

    2、y 修饰符

    ES6 为正则表达式新增了y修饰符 → “粘连”(sticky)修饰符。

    作用与g修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。

    不同之处在于,g修饰符只要剩余位置中存在匹配就可,而y修饰符确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的涵义。

    var s = 'aaa_aa';
    var r1 = /a+/g;
    
    r1.exec(s) // ["aaa"]
    r1.exec(s) // ["aa"]

    上面代码使用g修饰符,执行第一次后剩余字符串为_aa,由于g修饰符没有位置要求,所以第二次执行返回aa

    var s = 'aaa_aa';
    var r2 = /a+/y;
    
    r2.exec(s) // ["aaa"]
    r2.exec(s) // null

    上面代码使用y修饰符,执行第一次后剩余字符串为_aa,由于y修饰符要求匹配必须从头部开始,所以返回null

    如果改一下正则表达式,保证每次都能头部匹配,y修饰符就能返回结果了:

    var s = 'aaa_aa_a';
    var r3 = /a+_/y;
    
    r3.exec(s) // ["aaa_"]
    r3.exec(s) // ["aa_"]
  • 相关阅读:
    getBoundingClientRect()方法
    Sublime Text3 安装less
    less知识点总结(一)
    跨域知识(二)——JSONP
    面向过程和面向对象的区别(转)
    暴力+DP:买卖股票的最佳时机
    车的可用捕获量(3.26leetcode每日打卡)
    三维形体的表面积(3.25leetcode每日打卡)
    基础练习:FJ的字符串
    DP:打家劫舍
  • 原文地址:https://www.cnblogs.com/Leophen/p/11184559.html
Copyright © 2011-2022 走看看