2010-03-05 77 views
8

这可能是一个快速。为什么此代码不返回任何内容?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(); 
    } 
} 
} 

回答

15

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]+"匹配。如果这不是你想要的,那么正则表达式将不得不更复杂一些。或者你总是可以放弃不匹配的令牌。

0

变化

String pattern = "[A-Z]+"; 

String pattern = "[a-zA-Z]+"; 
0

如果您正在寻找打印出你的分隔符包围所有的话,你可能想是安全的,完全排除模式。这样你就不会碰到一个包含不在你模式中的字符的单词,这会导致你的程序退出该循环(就像它现在这样做)。例如:

while ((sc.hasNext())) { 

     System.out.println(sc.next()); 
    }