2013-03-19 56 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。