java - 简写正则表达式语法与长版本有何不同?

标签 java regex shorthand

我是一名 Java 和正则表达式初学者程序员,我想创建一个简单的字数统计程序。

我在使用下面的第二个示例时遇到了一些问题,我切换到第一个示例,它成功了。第二个程序不断地一遍又一遍地匹配同一个单词(无限地,所以程序的其余部分将无法完成),但第一个程序工作正常并计算了所有单词。我不知道为什么。我认为它们应该是相同的。

鉴于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());

感谢您的帮助。

(另外,你能帮我写一下标题吗?我不知道如何称呼“简写”代码。)

最佳答案

在代码中如

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/

相关文章:

java - 如何在 Android 上创建持久套接字连接?

java - JBOSS中的Maven项目,如何更改类加载器的优先级?

java - 未从资源包获取消息

java - 正则表达式解析街道名称

CSS3边框半径简写解决方案

javascript - if else 的 JS 简写

java - 推送通知时 MPNS 错误请求 (WP 8.1)

regex - 如何使用正则表达式获取括号之间的内容

symfony - 如何在 Symfony2 中将 `MyAcmeBundle:User` 解析为 `My\AcmeBundle\Entity\User`?

javascript - 匹配时带有重音字符的正则表达式