简写Regex语法与长版本有何不同?

时间:2014-11-02 13:34:18

标签: java regex shorthand

我是Java和正则表达式的初学程序员,我想创建一个简单的wordcount程序。

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

鉴于line是从另一个文字读取的行,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());

感谢您的帮助。

(另外,你能帮我一个标题吗?我不知道该怎么称呼&#34;简写&#34;代码。)

1 个答案:

答案 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之后记住最后找到的元素的位置,并将在此位置后搜索下一个。