2015-04-05 24 views
0

我想不通爲什麼這個循環不執行甚至一度:Scanner.hasNext(String s)已爲 「\ d \ \小號d」 失敗

String s = "1 2\n3 4"; 
Scanner scanner = new Scanner(s); 
while(scanner.hasNext("\\d\\s\\d")) { 
    System.out.printf("%d %d\n", scanner.nextInt(), scanner.nextInt()); 
} 

據我瞭解,「 \ d \ s \ d「表示數字,後面跟着空格,後面跟着另一個數字 - 確切地說,輸入是什麼樣的,但循環從不執行一次。

我的意圖是使用掃描儀與標準輸入,我想確保輸入有一個由空格分隔的兩位數對的序列,但上面的代碼示例被簡化了,因爲我認爲我在做錯了我使用正則表達式。

任何人都可以提供解釋嗎?提前致謝。

+0

你期望的輸出? – anubhava 2015-04-05 16:30:57

+0

我期望兩行分別包含兩個整數,所以第1行:「1 2」,第2行:「3 4」 – Caleb9 2015-04-05 16:31:44

回答

0

提供給hasNext(String)的模式StringScanner的標記化之後應用。

返回true如果下一個標記匹配模式從 指定字符串構造。

默認情況下,這是空格。因此\\d\\s\\d適用於您的String s中的字符1。顯然,這不匹配。

+0

我明白了。所以要解決這個問題,我希望我需要指定scanner.useDelimiter(「\\ n」)對不對?這不起作用雖然... :( – Caleb9 2015-04-05 16:29:31

+0

@ Caleb9不要把自己限制在'掃描儀'。消費完整的線路,並檢查事實。 – 2015-04-05 16:54:49

+0

謝謝。我已經編輯了更具體的問題。想要總是消耗兩個由stdin的空格分隔的數字對,使用新行或不使用這個文件,這是否有意義? – Caleb9 2015-04-06 09:10:22

0

根據您的意見,我相信你是最好使用String#split這裏:

String s = "1 2\n3 4"; 
toks = s.split("\n"); 
for (String tok: toks) 
    System.out.printf("<%s>%n", tok); 

輸出:

<1 2> 
<3 4> 

PS:您可以通過使用正則表達式來使用Scanner也匹配你的號碼:

String s = "1 2\n3 4"; 
Scanner scanner = new Scanner(s); 
while(scanner.hasNext("\\d+")) { 
    System.out.printf("<%d %d>%n", scanner.nextInt(), scanner.nextInt()); 

輸出:

<1 2> 
<3 4> 
+0

不完全是,我想使用掃描器來驗證輸入的正確結構。它通過行,我想要確保有兩個數字可用於輸入在循環體中使用它們。謝謝但。 – Caleb9 2015-04-05 16:35:38

+0

我還添加了一個基於'掃描儀'的解決方案。 – anubhava 2015-04-05 16:36:11

相關問題