匹配和分组
test
方法是匹配正则表达式最简单的方法。该方法只负责判断字符串是否与某个模式匹配。正则表达式还有一个exec
(执行,execute)方法,如果无法匹配模式则返回null
,否则返回一个表示匹配字符串信息的对象。
let match = /\d+/.exec("one two 100");
console.log(match);
// → ["100"]
console.log(match.index);
// → 8
exec
方法返回的对象包含index属性,表示字符串成功匹配的起始位置。除此之外,该对象看起来像(而且实际上就是)一个字符串数组,其首元素是与模式匹配的字符串——在上面的例子中就是我们查找的数字序列。
字符串也有一个类似的match方法。
console.log("one two 100".match(/\d+/));
// → ["100"]
若正则表达式包含使用圆括号包围的子表达式分组,与这些分组匹配的文本也会出现在数组中。第一个元素是与整个模式匹配的字符串,其后是与第一个分组匹配的部分字符串(表达式中第一次出现左圆括号的那部分),然后是第二个分组。
let quotedText = /'([^']*)'/;
console.log(quotedText.exec("she said 'hello'"));
// → ["'hello'", "hello"]
若分组最后没有匹配任何字符串(例如在元组后加上一个问号),结果数组中与该分组对应的元素将是undefined
。类似的,若分组匹配了多个元素,则数组中只包含最后一个匹配项。
console.log(/bad(ly)?/.exec("bad"));
// → ["bad", undefined]
console.log(/(\d)+/.exec("123"));
// → ["123", "3"]
分组是提取部分字符串的实用特性。如果我们不只是想验证字符串中是否包含日期,还想将字符串中的日期字符串提取出来,并将其转换成等价的日期对象,那么我们可以使用圆括号包围那些匹配数字的模式字符串,并直接将日期从exec
的结果中提取出来。
不过,我们暂且先讨论另一个话题——在 JavaScript 中存储日期和时间的内建方法。