10

这可能是一个快速的。为什么此代码不返回任何内容?

import java.util.Scanner;

public class MainClass {

public static void main(String[] args) {
    try {

        Scanner sc = new Scanner("asda ASA adad");
        String pattern = "[A-Z]+";

        while ((sc.hasNext(pattern))) {

            System.out.println(sc.next(pattern));
        }
        sc.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}
4

3 回答 3

18

hasNext(String pattern)true仅当下一个标记与模式匹配时才返回。在您的情况下,"asda"是下一个令牌,并且不匹配"[A-Z]+". 文档很清楚,“[the] 扫描仪不会超过任何输入”。

如果您将模式更改为"[A-Za-z]+",那么您将获得三个标记,这可能是您想要的。

如果实际上您只想获得匹配的令牌"[A-Z]+",那么您可以执行以下任何操作:

  • 简单地丢弃不匹配的令牌
  • useDelimiter("[^A-Z]+"),然后简单地调用next()
  • 采用skip("[^A-Z]+")
  • 采用findInLine("[A-Z]+")

提示:如果性能很关键,您可能希望使用Pattern这些方法的预编译重载。

提示:请记住"Xooo ABC"有两个"[A-Z]+"匹配项。如果这不是您想要的,那么正则表达式将不得不更复杂一些。或者您总是可以简单地丢弃不匹配的令牌。

于 2010-03-05T22:57:15.933 回答
0

改变

String pattern = "[A-Z]+";

String pattern = "[a-zA-Z]+";
于 2010-03-05T22:59:37.370 回答
0

如果您希望打印出由分隔符包围的所有单词,您可能希望安全并完全排除该模式。这样您就不会遇到包含不在您的模式中的字符的单词,这会导致您的程序退出该循环(就像它目前正在做的那样)。例如:

    while ((sc.hasNext())) {

        System.out.println(sc.next());
    }
于 2010-03-05T23:20:08.630 回答