• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • RegExp.prototype[@@matchAll]()

    **[@@matchAll]**方法返回对字符串使用正则表达式的所有匹配项。

    {{EmbedInteractiveExample("pages/js/regexp-prototype-@@matchall.html")}}

    语法

    regexp[Symbol.matchAll](str)
    

    参数

    str

    一个String的匹配对象。

    返回值

    一个迭代器。

    描述

    本方法在String.prototype.matchAll()中被内部调用。例如,以下两个示例返回相同的结果。

    'abc'.matchAll(/a/);
    
    /a/[Symbol.matchAll]('abc');
    

    本方法用于自定义RegExp子类中的匹配行为。

    示例

    直接调用

    本方法的使用方法几乎与String.prototype.matchAll()相同,除了this的不同以及参数顺序的的差异。

    var re = /[0-9]+/g;
    var str = '2016-01-02';
    var result = re[Symbol.matchAll](str);
    
    console.log(Array.from(result, x => x[0]));
    // ["2016", "01", "02"]
    

    在子类中使用@@matchAll

    RegExp的子类可以重写[@@matchAll]()方法来修改默认行为。例如,返回一个Array而不是iterator:

    class MyRegExp extends RegExp {
      [Symbol.matchAll](str) {
        var result = RegExp.prototype[Symbol.matchAll].call(this, str);
        if (!result) {
          return null;
        } else {
          return Array.from(result);
        }
      }
    }
    
    var re = new MyRegExp('([0-9]+)-([0-9]+)-([0-9]+)', 'g');
    var str = '2016-01-02|2019-03-07';
    var result = str.matchAll(re);
    console.log(result[0]); // [ "2016-01-02", "2016", "01", "02" ]
    console.log(result[1]); // [ "2019-03-07", "2019", "03", "07" ]