2014-11-02 32 views
0

我是一名Java和正则表达式的初学者程序员,我想创建一个简单的wordcount程序。速记正则表达式与长版本有何不同?

我在下面的第二个例子中遇到了一些麻烦,我切换到了第一个例子,它工作。第二个不停地匹配同一个单词(无限的,所以程序的其余部分不会完成),但第一个工作正确,并计算所有的单词。我不知道为什么。我认为他们应该是一样的。

鉴于line是从另一个文件读取线被wordcounted,wordPattern分开的话,wordListList<String>包含所有的话,再怎么是下面的代码:

Matcher match = word.matcher(line); 
while(match.find()) 
    wordList.add(match.group()); 

...与此代码不同?

while((Matcher match = word.matcher(line)).find()) 
    wordList.add(match.group()); 

感谢您的任何帮助。

(另外,你能帮助我的标题?我不知道叫什么“速记”的代码。)

回答

3

在这样的代码

while(condition){ 
    body 
} 

condition每次迭代代码之前被执行以检查是否应该执行{body}块。在每次迭代之前第二个例子

while((Matcher match = word.matcher(line)).find()) 
    wordList.add(match.group()); 

的情况下,你正在执行

(Matcher match = word.matcher(line)).find() 

这创造了新的Matcher实例。这里重要的是这些新实例总是设置为某种默认状态。在匹配类的情况下,这个状态包含了信息,它应该从传递字符串的开始处开始匹配(在你的情况下为line),这样每个新创建的匹配只能找到第一个匹配。

在你的第一个例子

Matcher match = word.matcher(line); 
while(match.find()) 
    wordList.add(match.group()); 

,因为您只使用一个实例匹配器,其中每个find后记得最后找到的元素的位置,并且将搜索后下一个的这个问题不存在这个位置。

+0

完全合理。谢谢!我会牢记这一点。 – 2014-11-02 13:54:00

+0

@Jon欢迎您:) – Pshemo 2014-11-02 13:54:40

+0

一种脱离主题,但是有一个名字来结合'Matcher'声明和'while'循环语句吗?这对我来说是新的,我认为它很酷,但我不知道该怎么称呼它。 – 2014-11-02 13:55:02