2013-04-15 57 views
1

試圖解析這個簡單的字符串分隔符爲兩個float變量原來是沒有價值的,比我最初以爲:如何表示「 」作爲掃描儀

-0.13 0.17% 

的(?唯一的)原因是,兩個數字之間的空格實際上是 。因此,第一個scanner.next()返回整個字符串:

Scanner scanner = new Scanner("-0.13 0.17%"); 
String first = scanner.next(); 

我知道掃描儀的useDelimiter()方法,但我怎麼告訴它使用 作爲分隔符?

我想useDelimiter(" "),但沒有奏效

我在做什麼錯?

回答

2

Scanner類缺省的分隔符是\p{javaWhitespace}+\p{javaWhitespace}由方法Character.isWhitespace定義,該方法根據定義排除了非間斷空格。

根據Java確定指定的字符是否爲空格。一個字符是一個Java空白字符,當且僅當它滿足以下條件之一:

  • 它是Unicode空格字符(SPACE_SEPARATORLINE_SEPARATOR,或PARAGRAPH_SEPARATOR),但不也是非打破空間('\u00A0''\u2007''\u202F')。
  • [...]

如果你想包括無休息空間,這是'\u00A0'也是默認的Java空格,你需要構建一個將它們組合在一起的正則表達式:

scanner.useDelimiter("[\\p{javaWhitespace}\u00A0]+"); 

請注意,+落後很重要。它導致整個模式匹配連續的空白序列。如果沒有這個,當有連續的​​空格時,next()將返回空字符串。

2

和號轉義序列只能在HTML和XML中使用,而不能在Java中使用。嘗試改用"\u00a0"

+0

This Works!謝謝。但我也嘗試過'useDelimiter(「\\ s」)',它也可以。所以現在突然間我有3種不同的方式可以工作。 :)哪一個最好? –

+0

@RegexRookie:'\\ s'不應該工作,除非字符串不包含不間斷空格。 – nhahtdh

2

160的ASCII碼是nbsp,所以用字符串連接一個帶有該值的字符,它應該可以工作。

char nbsp = 160; 
useDelimiter("" + nbsp); 
+2

這是一個Unicode序數,而不是ASCII。 – Taymon

+1

@Taymon其實這個也適用於我(除了你的''\ u00a0'''建議)。哪個更好? –