JavaScript正则表达式和子匹配

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (12)

为什么Javascript子匹配在g修改器设置时停止工作?

var text = 'test test test test';

var result = text.match(/t(e)(s)t/);
// Result: ["test", "e", "s"]

以上的工作很好,result[1]"e"result[2]"s"

var result = text.match(/t(e)(s)t/g);
// Result: ["test", "test", "test", "test"]

以上忽略我的捕获组。以下是唯一有效的解决方案吗?

var result = text.match(/test/g);
for (var i in result) {
    console.log(result[i].match(/t(e)(s)t/));
}
/* Result:
["test", "e", "s"]
["test", "e", "s"]
["test", "e", "s"]
["test", "e", "s"]
*/
提问于
用户回答回答于

使用Stringmatch()功能将不会返回捕获组,如果全球修改设置,因为你发现了。

在这种情况下,你会想使用一个RegExp对象并调用它的exec()函数。Stringmatch()几乎是相同RegExpexec(),除了在这样的情况下功能......。如果全局修改设置,正常的match()功能将不返回拍摄组,而RegExpexec()功能。(注意这里,以及其他地方。)

另一个要记住的问题是,exec()不会返回一个大数组中的匹配 - 它会一直返回匹配,直到它用完,在这种情况下它会返回null

所以,例如,你可以做这样的事情:

var pattern = /t(e)(s)t/g;  // Alternatively, "new RegExp('t(e)(s)t', 'g');"
var match;    

while (match = pattern.exec(text)) {
    // Do something with the match (["test", "e", "s"]) here...
}

另外要注意的是,RegExp.prototype.exec()RegExp.prototype.test()执行上提供的字符串的正则表达式,返回的第一个结果。每个顺序调用将RegExp.prototype.lastIndex根据字符串中的当前位置逐步完成结果集更新。

下面是一个例子://记住在示例和模式中有4个匹配。lastIndex从0开始

pattern.test(text); // pattern.lastIndex = 4
pattern.test(text); // pattern.lastIndex = 9
pattern.exec(text); // pattern.lastIndex = 14
pattern.exec(text); // pattern.lastIndex = 19

// if we were to call pattern.exec(text) again it would return null and reset the pattern.lastIndex to 0
while (var match = pattern.exec(text)) {
    // never gets run because we already traversed the string
    console.log(match);
}

pattern.test(text); // pattern.lastIndex = 4
pattern.test(text); // pattern.lastIndex = 9

// however we can reset the lastIndex and it will give us the ability to traverse the string from the start again or any specific position in the string
pattern.lastIndex = 0;

while (var match = pattern.exec(text)) {
    // outputs all matches
    console.log(match);
}

您可以找到有关如何在MDN上使用RegExp对象的信息(具体而言,这里是函数的文档)。exec()

扫码关注云+社区