2012-09-10 20 views
3

我想用Java中的Scanner類從配置文件中獲取數據。該文件的元素由空白分隔。然而,如果一個短語或元素應該被解釋爲一個字符串文字(包括空格),那麼雙引號或單引號會放在該元素的周圍。這樣看起來像這樣的文件:Java掃描器 - 除非引號存在,否則請用空格分隔?

> R 120 Something AWord 

> P 160 SomethingElse "A string literal" 

當使用Java Scanner類時,默認情況下它僅用空格分隔。 Scanner類具有useDelimiter()函數,它使用正則表達式爲文本指定不同的分隔符。然而,我不擅長正則表達式,所以我不確定我會如何做到這一點。

我怎樣才能用空格分隔,除非有引號包圍什麼?

回答

5

您可以使用scanner.findInLine(pattern)方法指定要保留字符串文字不被拆分。你只需要一個正則表達式來匹配一個無引號標記或一個引號。這一個可能的工作:

"[^\"\\s]+|\"(\\\\.|[^\\\\\"])*\"" 

(即正則表達式是額外的複雜,因爲它處理字符串內逃脫文字。)

例子:

String rx = "[^\"\\s]+|\"(\\\\.|[^\\\\\"])*\""; 
Scanner scanner = new Scanner("P 160 SomethingElse \"A string literal\" end"); 
System.out.println(scanner.findInLine(rx)); // => P 
System.out.println(scanner.findInLine(rx)); // => 160 
System.out.println(scanner.findInLine(rx)); // => SomethingElse 
System.out.println(scanner.findInLine(rx)); // => "A string literal" 
System.out.println(scanner.findInLine(rx)); // => end 

findInLine方法,顧名思義,只在當前行內有效。如果你想搜索整個輸入,你可以使用findWithinHorizon。您可以通過0作爲地平線告訴它使用無限的地平線:

scanner.findWithinHorizon(rx, 0); 
+0

這很好,謝謝! – dsw88