有人可以帮我理解正则表达式的exec方法吗?

时间:2015-06-22 08:44:58

标签: javascript regex

我为exec方法找到的最好的地方是Eloquent Javascript第9章:

“正则表达式也有一个exec(execute)方法,如果没有找到匹配则返回null,否则返回一个带有匹配信息的对象。从exec返回的对象有一个index属性告诉我们字符串中的位置成功的匹配开始。除此之外,该对象看起来像(实际上是)一个字符串数组,其第一个元素是匹配的字符串....“

到目前为止,这是有道理的,但后来有点令人困惑:

“当正则表达式包含用括号分组的子表达式时,匹配这些组的文本也将显示在数组中。整个匹配始终是第一个元素。”

好的,但是......

“下一个元素是与第一个组匹配的部分(其左括号在表达式中首先出现的那个),然后是第二个组,依此类推。”

var quotedText = /'([^']*)'/;
console.log(quotedText.exec("she said 'hello'"));
// → ["'hello'", "hello"]

我的困惑在于这个例子中的重复问候。我不明白为什么它会给我两个回头?

然后主题由以下内容组成:

“当一个组最终没有匹配时(例如,当后跟一个问号)时,它在输出数组中的位置将保持未定义。同样,当一个组多次匹配时,只有最后一个匹配最终在数组中。“

console.log(/bad(ly)?/.exec("bad"));
// → ["bad", undefined]
console.log(/(\d)+/.exec("123"));
// → ["123", "3"]

最后一句话和例子让我感到困惑....

任何关于此的灯光都会非常感激!

1 个答案:

答案 0 :(得分:7)

  

我不明白为什么它会给我两个回头?

因为数组中的第一个条目是表达式的整体匹配,然后是表达式定义的任何捕获组的内容。由于表达式定义了一个捕获组,因此您将获得两个条目。 整体匹配为 XmlNodeList allItems = xDoc.SelectNodes("//Person[not(PersonID = following::Person/PersonID)]"); StringBuilder xml = new StringBuilder("<Persons>"); foreach (XmlNode node in allItems) xml.Append(node.OuterXml); xml.Append("</Persons>"); XmlDocument newXDoc = new XmlDocument(); newXDoc.LoadXml(xml.ToString()); (带单引号),捕获组为'hello'(没有它们),因为在正则表达式中只有{{1} }在捕获组(括号)中,而hello在它之外:

 vvvvvvvvv----- Overall expression
/'([^']*)'/
  ^^^^^^^------ Capture group

让我们看一下hello示例:它说的是“匹配' 可选后跟/bad(ly)?/,捕获bad如果是那里。”所以你得到:

ly

假设我们将lyconsole.log(/bad(ly)?/.exec("bad")); // -> ["bad", undefined] // ^ ^ // | +--- first capture group has nothing in it // +---------- overall match is "bad" console.log(/bad(ly)?/.exec("badly")); // -> ["badly", "ly"] // ^ ^ // | +- first capture group has "ly" // +---------- overall match is "badly" 放在各个捕获组中,并将它们都设为可选:

l