Java:扫描模式的字符串

Mar*_*kis 10 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();
    }
}
}
Run Code Online (Sandbox Code Playgroud)

pol*_*nts 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]+"匹配.如果这不是你想要的,那么正则表达式将变得更复杂一些.或者您可以随时简单地丢弃不匹配的令牌.