2013-03-19 53 views
2

为什么下面的代码返回false?带有正则表达式分隔符的Java扫描器

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()); 

回答

5

扫描仪是用来打破的字符串为标记。分隔符是令牌之间的分隔符。分隔符是什么不是匹配的扫描仪;他们被丢弃。您告诉扫描仪-[a-zA-Z]\\s+是一个分隔符,因为-v匹配它正在跳过它的正则表达式。

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

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

+0

我说的是使用' - [a-zA-Z] \\ s +'作为分隔符,-v是输入。 – Sawyer 2013-03-19 00:51:08

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。