我是一名 Java 和正则表达式初学者程序员,我想创建一个简单的字数统计程序。
我在使用下面的第二个示例时遇到了一些问题,我切换到第一个示例,它成功了。第二个程序不断地一遍又一遍地匹配同一个单词(无限地,所以程序的其余部分将无法完成),但第一个程序工作正常并计算了所有单词。我不知道为什么。我认为它们应该是相同的。
鉴于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());
感谢您的帮助。
(另外,你能帮我写一下标题吗?我不知道如何称呼“简写”代码。)
最佳答案
在代码中如
while(condition){
body
}
在执行 condition
中的每次迭代代码之前,检查是否应执行 {body}
block 。对于第二个示例
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());
这个问题不存在,因为您只使用 Matcher 的一个实例,在每次 find
后,它会记住最后找到的元素的位置,并在之后搜索下一个元素这个位置。
关于java - 简写正则表达式语法与长版本有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26699859/