JavaScript正则expression式和子匹配

为什么在g修饰符被设置时Javascript子匹配停止工作?

 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"] 

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

 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()在提供的string上执行正则expression式并返回第一个结果。 每个顺序调用都会根据string中的当前位置逐步遍历结果集更新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); } 

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