1. 程式人生 > >關於Scanner的useDelimiter使用其它字元做為分隔符的詳細用法及特別之處

關於Scanner的useDelimiter使用其它字元做為分隔符的詳細用法及特別之處

由於最近在百度知道上遇到點特殊的問題,研究查閱後瞭解了些東西,拿出來分享下,這裡只針對Scanner的next()說它的分隔符,next()方法

查詢並返回來自此掃描器的下一個完整標記。完整標記的前後是與分隔模式匹配的輸入資訊。即使以前呼叫 hasNext() 返回了 true,在等待要掃描的輸入時此方法也可能阻塞。

import java.util.Scanner;

public class TestSc {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		//sc.useDelimiter("a");
		while (sc.hasNext()) {
			System.out.println("hasNext()判斷為true,我還有下一個:");
			System.out.println("下一個輸出是:"+sc.next());
		}
	}
}


Scanner預設使用的分隔符是空格、回車和tab,所以我們執行上述程式碼後輸入      a空格b'Tab'c回車    後輸出的結果是:

這時我們用useDelimiter改變其分割字元為"a";即將上面的註釋程式碼取消註釋。重新執行,這時我們輸入a空格b'Tab'c回車後結果是:


這時我們發現雖然hasNext判斷為true,但並沒有輸出next()的值。這裡的原因API已經說清楚了,即使以前呼叫 hasNext() 返回了 true,在等待要掃描的輸入時此方法也可能阻塞。此時還在等待輸入,並沒有掃描到下一個分隔符“a"(換用其它字元後,預設的tab建回車鍵不再起分隔符的作用,回車鍵只起了提交的作用)所以並沒有輸出next()的值,這時我們想輸出後面的bc只需要在等待輸入的視窗繼續輸入一個"a"回車,再看:

這時就將兩個分隔符a,之間的字串輸出來了。至於後面說我還有下一個,其實是剛才如入的回車。程式還在繼續等待掃描輸入....

再換一種方式,不用System.in了


直接用字串,預設空格,回車,tab做分隔符時,輸出如此,\n為回車\t為tab,中間的長空格是我直接按的tab鍵都生效了。

再次將註釋去掉結果如下

這時我們發現tab和回車不再當做分隔符,而是被直接輸出了,而且e後面沒有分隔符“a”還是輸出了,因為此時並沒有等待掃描輸入了。

就是這些,另外如果我們不想嚴格的使用某個字元,比如有個我們想用yes和回車做分隔符,我們可以用正則表示式,然後我們需要去分割的裡面輸入並不嚴格,有時yes前後有一個或多個空格,回車也是有時會空格後再回車,但我們不想要yes和回車前後的空格,而單獨的空格沒有yes和回車的話我們又要保留,則應該這樣寫:

import java.util.Scanner;

public class TestSc {
	public static void main(String[] args) {
		Scanner sc = new Scanner("a b	yes      byes c \n  d\te");
		sc.useDelimiter("\\s*yes\\s*|\\s*\n\\s*");
		while (sc.hasNext()) {
			System.out.print("有下一個,");
			System.out.print("下一個輸出是:"+sc.next());
		}
	}
}
為了看出效果,我們不再用帶回車的輸出行System.out.println而是用System.out.print.效果如下:

這裡的正則表示式"\\s*yes\\s*|\\s*\n\\s*"解釋。\s可以匹配空格、製表符、換頁符等空白字元的其中任意一個,用了兩個\第一個\的轉義字元,第二個是連用的\s。*修飾匹配次數為 0 次或任意次如果想匹配*這個字元的話需要用\*。後面yes不用說,再後面又一個\\s*,表明分割字元為yes,前後可有0個或任意個空格,製表符等。。後面的'|'或的意思,同理表示回車前後可有0或任意個....其中的第一個yes前輸入的是tab和後面的\t都被\s匹配掉而沒有輸出。

Java學習交流群:   2177712