【发布时间】:2015-06-22 08:44:58
【问题描述】:
我为 exec 方法找到的最佳位置是 Eloquent Javascript Chapter 9:
“正则表达式还有一个 exec(执行)方法,如果没有找到匹配项,它将返回 null,否则返回一个包含匹配信息的对象。从 exec 返回的对象有一个 index 属性,它告诉我们在字符串中的位置成功匹配开始。除此之外,对象看起来(实际上是)一个字符串数组,其第一个元素是匹配的字符串...."
到目前为止,这是有道理的,但后来有点令人困惑:
“当正则表达式包含用括号分组的子表达式时,匹配这些组的文本也将显示在数组中。整个匹配始终是第一个元素。”
好的,但是...
“下一个元素是第一组匹配的部分(左括号在表达式中最先出现的那个),然后是第二组,依此类推。”
var quotedText = /'([^']*)'/;
console.log(quotedText.exec("she said 'hello'"));
// → ["'hello'", "hello"]
我的困惑是在这个例子中重复打招呼。我不明白为什么它会给我两个你好?
然后主题被以下内容包裹起来:
"当一个组最终没有被匹配时(例如,当后面跟着一个问号时),它在输出数组中的位置将保持未定义。同样,当一个组被多次匹配时,只有最后一个match 最终出现在数组中。”
console.log(/bad(ly)?/.exec("bad"));
// → ["bad", undefined]
console.log(/(\d)+/.exec("123"));
// → ["123", "3"]
最后一句话和例子让我很困惑....
对此的任何启示将不胜感激!
【问题讨论】:
-
一个用于匹配,一个用于捕获
-
“我不明白为什么它会给我两个 hello 回复?” 表达式包含一个捕获组,它偶然捕获了整个匹配。因此,您两次获得相同的值。
-
@FelixKling
the expression contains a capture group that incidentally captures the whole match错误,首先匹配'hello'2,捕获hello(不带引号) -
@AvinashRaj:我的错,我错过了报价。似乎OP也可能有;)
标签: javascript regex