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"] */
正如你发现的那样,如果设置了全局修饰符,使用String
的match()
函数将不会返回捕获的组。
在这种情况下,您将需要使用RegExp
对象并调用其exec()
函数。 String
的match()
几乎和RegExp
的exec()
函数一样…除了这些情况。 如果设置了全局修饰符,普通的match()
函数将不会返回被捕获的组,而RegExp
的exec()
函数将会返回。 ( 在这里注明,等等。)
另一个要记住的问题是, 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()
函数的文档)。