0
点赞
收藏
分享

微信扫一扫

ES6-13【正则方法、修饰符yus、UTF_16编码方式】

晴儿成长记 2022-04-25 阅读 55

一、正则新特性

(1)正则回顾

  1. 修饰符

    1. global -g
    2. ignoreCase -i
    3. mutli-line -m
  2. 元字符

    1. \w \W word
    2. \d \D digit [0-9]
    3. \s \S space \n \r \t \v \f
    4. \b \B bridge
    5. . 除了\n \r所有字符
  3. 贪婪模式

    能匹配多,就不匹配少

  4. 正向预查(先行断言)(先行否定断言)

    例:x后面紧跟着y /x(?=y)/

(2)新增特性

  1. 声明正则的变化方式

    1. 传统声明方式

      var reg = /xyz/ig
      var reg = new RegExp('xyz', 'ig');
      var reg = new RegExp(/xyz/gi);
      
    2. 新增声明方式

      var reg = new RegExp(/xyz/gi, 'gm');  // 如果两边都存在修饰符,则以后面为准
      
  2. 字符串上的正则方法进行了调整:将字符串上的正则方法调整到了正则原型上

    RegExp.prototype[Symbol.match];
    RegExp.prototype[Symbol.replace];
    RegExp.prototype[Symbol.search];
    RegExp.prototype[Symbol.split];
    // 当字符串调用这些正则方法的时候,实际是调用了正则原型上的方法
    console.log(String.prototype.match);
    console.log(String.prototype.replace);
    console.log(String.prototype.search);
    console.log(String.prototype.split); 
    
  3. 新增的修饰符 y u s

    1. y(sticky)粘黏

      与g的对比,主要体现在exec:

      var str = 'aaa_aa_a';
      var reg1 = /a+/g;
      var reg2 = /a+/y;
      // 第一次exec
      console.log(reg1.exec(str));//['aaa',index:0,input:'aaa_aa_a']
      console.log(reg2.exec(str));//['aaa',index:0,input:'aaa_aa_a']
      // 第二次exec
      console.log(reg1.exec(str));//['aa',index:4,input:'aaa_aa_a']
      console.log(reg2.exec(str));//null
      
    2. u(unicode)

      可以识别编码极限以上的字符

      1. 码点(UTF-16编码):每个码点可以存储两个字节
        U+0000 ~ U+D800 是一些常用的字,用两个字节表示一个字符(‘\u20bb7’: 超出了编码极限)
        U+D800 ~ U+FFFF 是一些生僻的字,用四个字节表示一个字符(‘\uD842\uDFB7’: 𠮷,也可用’\u{2pbb7}'代替,JS会帮忙解析{}里的内容)

      2. es5不支持四个字节表示一个字符

        console.log(/^\uD83D/.test('\uD83D\uDC2A'))//true es5只能识别D800一下的字符(认为\uD83D是一个字符)
        console.log(/^\uD83D/u.test('\uD83D\uDC2A'))//false  -u可以识别D800以上的字符(认为\uD83D\uDC2A是一个字符)
        
      3. . 修饰符不能匹配超出编码极限的字符

        var s = '\uD842\uDFB7';
        console.log(s); //𠮷
        console.log(/^.$/.test(s)); //false 超出了编码极限无法匹配了
        console.log(/^.$/u.test(s)); //true 
        
    3. s

      匹配所有

      s = dotAll

      .可以匹配任何字符包括\n等等特殊,es2018实现了,目前兼容可能有问题,所以用s

      console.log(/foo.bar/.test('foo\nbar')); //false
      console.log(/foo.bar/s.test('foo\nbar')); //true
      console.log(/foo.bar/s.dotAll); //true
      
  4. 新增方法

    1. 查看修饰符是否定义:

      var reg = new RegExp('xyz','ig');
      console.log(reg.global) true
      console.log(reg.ignoreCase) true
      console.log(reg.multiLine) false
      
    2. 查看正则主体和修饰符

      var reg = /\wabed/giy;
      console.log(reg.source); // wabed
      console.log(reg.flags); // giy
      
举报

相关推荐

0 条评论