Java:扫描模式的字符串

时间:2010-03-05 22:50:12

标签: java java.util.scanner

这可能很快。为什么这段代码没有返回任何内容?

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();
    }
}
}

3 个答案:

答案 0 :(得分:16)

如果下一个标记与模式匹配,则

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

如果您将模式更改为"[A-Za-z]+",那么您将获得三个令牌,这可能与您的意图相符。

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

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

提示:如果性能至关重要,您需要使用这些方法的预编译Pattern重载。

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

答案 1 :(得分:0)

更改

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

String pattern = "[a-zA-Z]+";

答案 2 :(得分:0)

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

    while ((sc.hasNext())) {

        System.out.println(sc.next());
    }