我是Java和正则表达式的初学程序员,我想创建一个简单的wordcount程序。
我在下面的第二个例子中遇到了一些麻烦,我切换到了第一个例子,并且它有效。第二个一遍又一遍地匹配相同的单词(无限,所以程序的其余部分都不会完成),但是第一个工作正确并计算所有单词。我不知道为什么。我认为他们应该是一样的。
鉴于line
是从另一个文字读取的行,word
是Pattern
来区分单词,wordList
是List<String>
}包含所有单词,那么以下代码如何:
Matcher match = word.matcher(line);
while(match.find())
wordList.add(match.group());
...与此代码不同?
while((Matcher match = word.matcher(line)).find())
wordList.add(match.group());
感谢您的帮助。
(另外,你能帮我一个标题吗?我不知道该怎么称呼&#34;简写&#34;代码。)
答案 0 :(得分:3)
在像
这样的代码中while(condition){
body
}
在执行condition
的每个迭代代码之前检查是否应该执行{body}
块。在第二个例子的情况下
while((Matcher match = word.matcher(line)).find())
wordList.add(match.group());
在每次迭代之前执行
(Matcher match = word.matcher(line)).find()
创建新的Matcher
实例。这里重要的是这些新实例总是设置为某个默认状态。在Matcher类的情况下,这个状态包含它应该从传递的字符串的开始开始匹配的信息(在你的情况下为line
),所以这些新创建的匹配中的每一个只能找到第一个匹配。
在你的第一个例子中
Matcher match = word.matcher(line);
while(match.find())
wordList.add(match.group());
此问题不存在,因为您只使用匹配的一个实例,在每个find
之后记住最后找到的元素的位置,并将在此位置后搜索下一个。