Java:扫描字符串的模式
问题描述:
这可能是一个快速。为什么此代码不返回任何内容?Java:扫描字符串的模式
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();
}
}
}
答
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]+"
匹配。如果这不是你想要的,那么正则表达式将不得不更复杂一些。或者你总是可以放弃不匹配的令牌。
答
变化
String pattern = "[A-Z]+";
到
String pattern = "[a-zA-Z]+";
答
如果您正在寻找打印出你的分隔符包围所有的话,你可能想是安全的,完全排除模式。这样你就不会碰到一个包含不在你模式中的字符的单词,这会导致你的程序退出该循环(就像它现在这样做)。例如:
while ((sc.hasNext())) {
System.out.println(sc.next());
}