我发现exec方法最好的学习资料是《JavaScript编程精解》第9章:
正则表达式还有一个exec(执行)方法,如果没有找到匹配项,则返回null,否则返回包含匹配信息的对象。从exec返回的对象具有一个index属性,它告诉我们成功匹配开始的字符串位置。除此之外,该对象看起来像(实际上也是)由字符串数组组成,其第一个元素是匹配的字符串...."
这里都很好理解,但接下来会有点混淆:
当正则表达式包含用括号分组的子表达式时,与这些分组匹配的文本也将出现在数组中。整个匹配始终是第一个元素。
好吧,但...
下一个元素是第一组匹配的部分(其开头括号在表达式中首先出现),然后是第二组,以此类推。
这个例子让我很困惑,希望你能给予解释。
非常感谢!
正则表达式还有一个exec(执行)方法,如果没有找到匹配项,则返回null,否则返回包含匹配信息的对象。从exec返回的对象具有一个index属性,它告诉我们成功匹配开始的字符串位置。除此之外,该对象看起来像(实际上也是)由字符串数组组成,其第一个元素是匹配的字符串...."
这里都很好理解,但接下来会有点混淆:
当正则表达式包含用括号分组的子表达式时,与这些分组匹配的文本也将出现在数组中。整个匹配始终是第一个元素。
好吧,但...
下一个元素是第一组匹配的部分(其开头括号在表达式中首先出现),然后是第二组,以此类推。
var quotedText = /'([^']*)'/;
console.log(quotedText.exec("she said 'hello'"));
// → ["'hello'", "hello"]
我对这个例子中重复的“hello”感到困惑。我不明白为什么它会给我返回两个“hello”?
然后,以下内容概括了该主题:
“当一个组没有被完全匹配时(例如,跟随一个问号),它在输出数组中的位置将保持未定义。同样,当一个组被多次匹配时,只有最后一次匹配结果会出现在数组中。”
console.log(/bad(ly)?/.exec("bad"));
// → ["bad", undefined]
console.log(/(\d)+/.exec("123"));
// → ["123", "3"]
这个例子让我很困惑,希望你能给予解释。
非常感谢!
表达式包含一个捕获组,无意中捕获了整个匹配
是错误的,首先匹配是'hello'
2,捕获是hello
(不带引号) - Avinash Raj