执行几次相同的正则表达式匹配时,我看到一个奇怪的行为:
var r = /(.*)/g
var d = "a"
console.log(r.exec(d))
console.log(r.exec(d))
这将产生:
["a", "a"]
["", ""]
为什么第二次不匹配?
最佳答案
这就是g
标志的作用。当您使用它时,exec将从上一个匹配项的末尾继续进行下一个搜索。但是在您的第一个匹配项(a
)之后,字符串中再也没有剩下的了,因此您将获得一个空匹配项。此空匹配通常用于终止exec
-loop。如果您知道只有一个匹配项,请删除g
(这意味着“全局”搜索)。
请注意,您可以(并且应该)删除这些括号。它们只会降低您的性能。没有它们,您将在结果数组中仅获得一个a
。
如果您确实要考虑多个匹配项,但不考虑最后一个空匹配项,请使用循环技术:
var match;
while(match = r.exec(d))
// process match[0] here
请注意,只有在实际上具有(有意义的)捕获组时,才需要此循环。如果不是(如果只想获得完全匹配),则可以使用
match
代替,elclanrs指出:var matches = d.match(r);
编辑:
我刚刚意识到,我所说的大部分内容都是部分正确的,但不是
["", ""]
的真正原因。真正发生的是:第一次.*
与a
匹配。引擎第二次尝试在上一个匹配项(a
之后)之后继续搜索。由于您的模式具有.*
(表示0个或多个字符),因此它将继续匹配空字符串(因为它们与模式匹配)。匹配空字符串也不会提高下一个搜索的位置。因此,即使使用.match
,您也将获得["a", ""]
(match
足够聪明,可以在这种情况下中止)。实际上,如果将该正则表达式与循环技术一起使用,您将得到一个无限循环(因为
match = ["", ""]
显然不会导致循环终止)。但是无论如何,您应该意识到由于*
,您的模式是荒谬的。它可以匹配任何内容(包括所有内容)。至少使用.+
。出于任何目的。
关于javascript - javascript regex exec不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13868904/