为什么以下代码返回false?
Scanner sc = new Scanner("-v ");
sc.useDelimiter("-[a-zA-Z]\\s+");
System.out.println(sc.hasNext());
奇怪的是-[a-zA-Z]//s+
将返回true。
我也无法理解为什么会返回true:
Scanner sc = new Scanner(" -v");
sc.useDelimiter("-[a-zA-Z]\\s+");
System.out.println(sc.hasNext());
答案 0 :(得分:5)
扫描仪用于将字符串分解为标记。分隔符是标记之间的分隔符。分隔符是扫描仪匹配的 ;他们被丢弃了。您告诉扫描器-[a-zA-Z]\\s+
是分隔符,并且-v
匹配该正则表达式,它会跳过它。
如果您要查找与正则表达式匹配的字符串,请使用String.matches()
。
如果您的目标确实是将字符串拆分为令牌,那么您可能还会考虑String.split()
,这有时会更方便使用。
答案 1 :(得分:1)
感谢John Kugelman,我认为你是对的。
扫描仪可以使用自定义分隔符将输入拆分为令牌。 默认分隔符是一个空格。
当分隔符与任何输入都不匹配时,它会将所有输入作为一个标记:
Scanner sc = new Scanner("-v");
sc.useDelimiter( "-[a-zA-Z]\\s+");
if(sc.hasNext())
System. out.println(sc.next());
在上面的代码中,分隔符实际上没有得到任何匹配,所有输入“-v”将是单个令牌。 hasNext()表示有下一个标记。
Scanner sc = new Scanner( "-v ");
sc.useDelimiter( "-[a-zA-Z]\\s+");
if(sc.hasNext())
System. out.println(sc.next());
这将与分隔符匹配,并且分割以0标记结束,因此hasNext()为false。