Javascript正则表达式在每次调用时都会失败

Pan*_*lon 13 javascript

我使用以下Javascript从文本文件中读取字符串并使用正则表达式处理它们

while (!textFile.AtEndOfStream)
{
    currLine = textFile.ReadLine();
    match = re.exec(currLine);
    do stuff with match
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是每隔一次调用re.exec就会失败并返回null; 所以第一行处理正确,但第二行结果为null,然后第三行工作,第四行结果为null.

我可以使用以下代码来获得我想要的结果

while (!textFile.AtEndOfStream)
{
    currLine = textFile.ReadLine();
    match = re.exec(currLine);
    if (match == null) match = re.exec(currLine);
}
Run Code Online (Sandbox Code Playgroud)

但这似乎是一个讨厌的kludge.任何人都可以告诉我为什么会发生这种情况以及我能做些什么来正确解决它?

bob*_*nce 35

re的定义是"全局"修饰符,例如.类似的东西/foo/g.

当RegExp是全局的时,它会在RegExp实例中保留隐藏状态,以便记住它匹配的最后一个位置.下次搜索时,它将从最后一场比赛结束的索引向前搜索,并从那里找到下一场比赛.如果你将一个不同的字符串传递给你上次传递的字符串,这将产生高度不可预测的结果!

当你使用global正则表达式时,你应该反复调用它们直到你得到它们null.然后,下次使用它时,您将再次从字符串的开头进行匹配.或者您可以明确地设置re.lastIndex0使用一个前.如果你只想测试一个匹配的存在,就像在这个例子中一样,最简单的就是不使用g.

JS RegExp接口是该语言中最令人困惑,设计较差的部分之一.(这是JavaScript,所以说了很多.)

  • +1,删除了我的赞成这一点。我想扩展我的内容,但我偏离了方向:-) (2认同)