这可能很快。为什么这段代码没有返回任何内容?
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();
}
}
}
答案 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());
}