我使用以下Javascript从文本文件中读取字符串并使用正则表达式处理它们
while (!textFile.AtEndOfStream)
{
currLine = textFile.ReadLine();
match = re.exec(currLine);
do stuff with match
}
我遇到的问题是每隔一次调用re.exec就会失败并返回null;所以第一行处理正确,但第二行导致null,然后第三行工作,第四行导致null。
我可以使用以下代码来获得我想要的结果
while (!textFile.AtEndOfStream)
{
currLine = textFile.ReadLine();
match = re.exec(currLine);
if (match == null) match = re.exec(currLine);
}
但这似乎是一个令人讨厌的kludge。任何人都可以告诉我为什么会发生这种情况以及我能做些什么来正确解决它?
答案 0 :(得分:32)
您的re
是使用'global'修饰符定义的,例如。类似于/foo/g
。
当RegExp是全局的时,它会在RegExp实例中保留隐藏状态,以便记住它匹配的最后一个位置。下次搜索时,它将从最后一场比赛结束的索引向前搜索,并从那里找到下一场比赛。如果您将不同的字符串传递给您上次传递的字符串,则会产生高度不可预测的结果!
当你使用g
lobal regexp时,你应该反复调用它们,直到你得到null
。然后,下次使用它时,您将再次从字符串的开头进行匹配。或者,您可以在使用之前将re.lastIndex
明确设置为0
。如果你只想测试一个匹配的存在,就像在这个例子中一样,最简单的就是不要使用g
。
JS RegExp接口是该语言中最令人困惑,设计最差的部分之一。 (这是JavaScript,所以说了很多。)
答案 1 :(得分:3)
Javascript正则表达式在执行之间保持一些状态,你可能会陷入该陷阱。
我总是使用String.match函数并且从未被咬过:
while (!textFile.AtEndOfStream)
{
match = textFile.ReadLine ().match (re);
do stuff with match
}