【发布时间】:2017-01-31 15:34:23
【问题描述】:
我正在浏览 Eloquent Javascript 的 RegEx 章节 (http://eloquentjavascript.net/09_regexp.html),但我被他们的一个例子困住了:
var input = "A string with 3 numbers in it... 42 and 88.";
var number = /\b(\d+)\b/g;
var match;
while (match = number.exec(input))
console.log("Found", match[1], "at", match.index);
// → Found 3 at 14
// Found 42 at 33
// Found 88 at 40
RegEx 本身很简单,但我认为 match[1] 给出了匹配的正确字符串很奇怪。所以我把它改成match[0],运行它,得到了完全相同的结果。
所以我把程序也改成打印出match,果然,我得到了一个在索引0和1处具有相同值的数组:
var input = "A string with 3 numbers in it... 42 and 88.";
var number = /\b(\d+)\b/g;
var match;
while (match = number.exec(input)){
console.log("Found", match[1], "at", match.index);
console.log(match);
}
// → Found 3 at 14
// ["3", "3"]
// Found 42 at 33
// ["42", "42"]
// Found 88 at 40
// ["88", "88"]
我不知道为什么会得到这个结果,也看不出将匹配的文本两次推送到同一个数组的目的。鉴于他们之前的例子,这更没有意义:
var digit = /\d/g;
console.log(digit.exec("here it is: 1"));
// → ["1"]
console.log(digit.exec("and now: 1"));
// → null
这里发生了什么?为什么 .exec 有时在数组中只返回一次值,而在其他时候在数组中返回两次?
【问题讨论】:
-
因为捕获组。
-
实际上,
RegExp#exec与String#match使用不带全局修饰符的正则表达式做同样的事情。见stackoverflow.com/questions/9002771/…
标签: javascript arrays regex