带有正则表达式分隔符的Java Scanner

时间:2013-03-19 00:40:44

标签: java java.util.scanner

为什么以下代码返回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());

2 个答案:

答案 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。