javascript - javascript regex exec不一致

标签 javascript regex

执行几次相同的正则表达式匹配时,我看到一个奇怪的行为:

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/

相关文章:

javascript - 在 JavaScript 中解析相对 URL

c++ - C++ 中的正则表达式 : Requires compiler support error

javascript - 匹配两个给定标记内的所有文本

javascript - 使用 Meteor.js 从服务器下载文件

javascript - 防止多重连接到我的 Web 应用程序

javascript - 调整大小脚本附加对象,一遍又一遍地执行

javascript - Uncaught ReferenceError : doSearch is not defined

Java正则表达式匹配太多

java - 从字符串中提取数字

regex - 使用\(反斜杠)在HIVE hadoop中查询