2010-03-05 76 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()); 
    }