匹配和分组

test方法是匹配正则表达式最简单的方法。该方法只负责判断字符串是否与某个模式匹配。正则表达式还有一个exec(执行,execute)方法,如果无法匹配模式则返回null,否则返回一个表示匹配字符串信息的对象。

  1. let match = /\d+/.exec("one two 100");
  2. console.log(match);
  3. // → ["100"]
  4. console.log(match.index);
  5. // → 8

exec方法返回的对象包含index属性,表示字符串成功匹配的起始位置。除此之外,该对象看起来像(而且实际上就是)一个字符串数组,其首元素是与模式匹配的字符串——在上面的例子中就是我们查找的数字序列。

字符串也有一个类似的match方法。

  1. console.log("one two 100".match(/\d+/));
  2. // → ["100"]

若正则表达式包含使用圆括号包围的子表达式分组,与这些分组匹配的文本也会出现在数组中。第一个元素是与整个模式匹配的字符串,其后是与第一个分组匹配的部分字符串(表达式中第一次出现左圆括号的那部分),然后是第二个分组。

  1. let quotedText = /'([^']*)'/;
  2. console.log(quotedText.exec("she said 'hello'"));
  3. // → ["'hello'", "hello"]

若分组最后没有匹配任何字符串(例如在元组后加上一个问号),结果数组中与该分组对应的元素将是undefined。类似的,若分组匹配了多个元素,则数组中只包含最后一个匹配项。

  1. console.log(/bad(ly)?/.exec("bad"));
  2. // → ["bad", undefined]
  3. console.log(/(\d)+/.exec("123"));
  4. // → ["123", "3"]

分组是提取部分字符串的实用特性。如果我们不只是想验证字符串中是否包含日期,还想将字符串中的日期字符串提取出来,并将其转换成等价的日期对象,那么我们可以使用圆括号包围那些匹配数字的模式字符串,并直接将日期从exec的结果中提取出来。

不过,我们暂且先讨论另一个话题——在 JavaScript 中存储日期和时间的内建方法。