正则的扩展
正则的扩展
  RegExp 构造函数
    ES6中，构造函数RegExp第一个参数是一个正则对象，第二个参数可以使用指定修饰符了
      new RegExp(/abc/ig, 'i').flags
// "i"
  字符串的正则方法
    ES6 出现之前，字符串对象共有 4 个方法，可以使用正则表达式：match()、replace()、search()和split()
    ES6 将这 4 个方法，在语言内部全部调用RegExp的实例方法，从而做到所有与正则相关的方法，全都定义在RegExp对象上
      String.prototype.match 调用 RegExp.prototype[Symbol.match]
      String.prototype.replace 调用 RegExp.prototype[Symbol.replace]
      String.prototype.search 调用 RegExp.prototype[Symbol.search]
      String.prototype.split 调用 RegExp.prototype[Symbol.split]
  u 修饰符
    添加了u修饰符，含义为“Unicode 模式”，用来正确处理大于\uFFFF的 Unicode 字符。也就是说，会正确处理四个字节的 UTF-16 编码
    RegExp.prototype.unicode 属性
      表示是否设置了u修饰符
  y 修饰符
    y修饰符的作用与g修饰符类似，也是全局匹配，后一次匹配都从上一次匹配成功的下一个位置开始
    不同之处在于，g修饰符只要剩余位置中存在匹配就可，而y修饰符确保匹配必须从剩余的第一个位置开始
      var s = 'aaa_aa_a';
var r1 = /a+/g;
var r2 = /a+/y;
r1.exec(s) // ["aaa"]
r2.exec(s) // ["aaa"]
r1.exec(s) // ["aa"]
r2.exec(s) // null
    RegExp.prototype.sticky 属性
      表示是否设置了y修饰符
  RegExp.prototype.flags 属性
    返回正则表达式的修饰符
  s 修饰符：dotAll 模式
    正则表达式中，点（.）是一个特殊字符，代表任意的单个字符，但是有两个例外
      一个是四个字节的 UTF-16 字符，这个可以用u修饰符解决
      另一个是行终止符
        U+000A 换行符（\n）
        U+000D 回车符（\r）
        U+2028 行分隔符（line separator）
        U+2029 段分隔符（paragraph separator）
    ES2018 引入s修饰符，使得.可以匹配任意单个字符
  后行断言
    ES2018 引入后行断言，V8 引擎 4.9 版（Chrome 62）已经支持
  Unicode 属性类
    ES2018 引入了一种新的类的写法\p{...}和\P{...}，允许正则表达式匹配符合 Unicode 某种属性的所有字符
      const regexGreekSymbol = /\p{Script=Greek}/u;
regexGreekSymbol.test('π') // true
  具名组匹配
    ES2018 引入了具名组匹配（Named Capture Groups），允许为每一个组匹配指定一个名字，既便于阅读代码，又便于引用
      const RE_DATE = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const matchObj = RE_DATE.exec('1999-12-31');
const year = matchObj.groups.year; // "1999"
const month = matchObj.groups.month; // "12"
const day = matchObj.groups.day; // "31"
  解构赋值和替换
    有了具名组匹配以后，可以使用解构赋值直接从匹配结果上为变量赋值
      let {groups: {one, two}} = /^(?<one>.*):(?<two>.*)$/u.exec('foo:bar');
one // foo
two // bar
  引用
    如果要在正则表达式内部引用某个“具名组匹配”，可以使用\k<组名>的写法
      const RE_TWICE = /^(?<word>[a-z]+)!\k<word>$/;
RE_TWICE.test('abc!abc') // true
RE_TWICE.test('abc!ab') // false
  正则匹配索引
    现在有一个第三阶段提案，为exec()方法的返回结果加上indices属性，在这个属性上面可以拿到匹配的开始位置和结束位置
      const text = 'zabbcdef';
const re = /ab/;
const result = re.exec(text);
result.index // 1
result.indices // [ [1, 3] ]
  String.prototype.matchAll()
    ES2020 增加了String.prototype.matchAll()方法，可以一次性取出所有匹配。不过，它返回的是一个遍历器（Iterator），而不是数组