【问题标题】:Eloquent Javascript RegEx Example: Why Is Exec Returning A Two-Item Array?Eloquent Javascript RegEx 示例:为什么 Exec 返回一个包含两项的数组?
【发布时间】: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 有时在数组中只返回一次值,而在其他时候在数组中返回两次?

【问题讨论】:

标签: javascript arrays regex


【解决方案1】:

.exec()始终返回匹配的字符串作为数组中的初始元素,然后将任何匹配的组作为其余的索引返回。

例子:

var regex1 = /abc/;

var regex2 = /a(b)c/;

var string = 'We always match "abc".';

console.log(regex1.exec(string));
console.log(regex2.exec(string));

所以,这两个模式匹配相同的东西,但由于在第二个示例中存在组捕获b,它将由exec() 返回。

【讨论】:

  • 我现在明白了。我只是不完全了解返回的内容。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
  • 2015-06-22
  • 2019-09-09
  • 1970-01-01
相关资源
最近更新 更多