我为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"]
最后一句话和例子让我感到困惑....
任何关于此的灯光都会非常感激!
答案 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
假设我们将ly
和console.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