• 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_"]
  • 相关阅读:
    MySQL 中无法 insert 文件路径 中的 backward slash的解决方法
    生成颜色代码的 Java程序
    公积金贷款不受影响 组合贷款有特殊
    ADOMD.NET Client Object架构
    心情•笔记20061231
    微软所谓的"无人工介入的自动的机器翻译系统"
    游戏中的微软
    商业智能的个人理解
    无日
    从电影死亡笔记看商业智能在治安领域的应用
  • 原文地址:https://www.cnblogs.com/Leophen/p/11184559.html
Copyright © 2020-2023  润新知