2

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

2 回答 2

6

扫描仪用于将字符串分解为标记。分隔符是标记之间的分隔。分隔符是扫描仪匹配的;他们被丢弃了。您告诉扫描仪这-[a-zA-Z]\\s+是一个分隔符,并且由于-v匹配该正则表达式,它会跳过它。

如果您正在寻找与正则表达式匹配的字符串,请使用String.matches().

如果您的目标确实是将字符串拆分为标记,那么您也可以考虑String.split()使用 ,这有时更方便使用。

于 2013-03-19T00:46:57.547 回答
1

谢谢约翰库格曼,我认为你是对的。

Scanner 可以使用自定义分隔符将输入拆分为标记。默认分隔符是空格。

当 delimiter 不匹配任何输入时,它会将所有输入作为一个标记:

    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() 为假。

于 2013-03-19T01:26:19.147 回答