2016-11-16 61 views
3

爲什麼Java String.split()在使用代碼中定義的字符串時會生成不同的結果,而涉及到數字時會從文件中讀取字符串?具體來說,我有一個名爲包含由空格分隔的字符和數字「的test.txt」文件:使用字符串時,Java split()的結果會有所不同

G H 5 4 

分割方法並不如預期各執空間。但是,如果在代碼中創建一個字符串變量,並使用空格分隔相同的字符和數字,則split()的結果是四個單獨的字符串,一個用於char和number。下面的代碼演示了這種差異:

import java.io.File; 
    import java.io.FileReader; 
    import java.io.BufferedReader; 

    public class SplitNumber { 

    //Read first line of text file 
    public static void main(String[] args) { 
     try { 
     File file = new File("test.txt"); 
     FileReader fr = new FileReader(file); 
     BufferedReader bufferedReader = new BufferedReader(fr); 

     String firstLine; 
     if ((firstLine = bufferedReader.readLine()) != null) { 
      String[] firstLineNumbers = firstLine.split("\\s+"); 
      System.out.println("First line array length: " + firstLineNumbers.length); 

      for (int i=0; i<firstLineNumbers.length; i++) { 
      System.out.println(firstLineNumbers[i]); 
      } 
     } 
     bufferedReader.close(); 

     String numberString = "G H 5 4"; 
     String[] numbers = numberString.split("\\s+"); 
     System.out.println("Numbers array length: " + numbers.length); 

     for (int i=0; i<numbers.length; i++) { 
      System.out.println(numbers[i]); 
     } 
     } catch(Exception exception) { 
     System.out.println("IOException occured"); 
     exception.printStackTrace(); 
     } 
    } 
    } 

結果是:

First line array length: 3 
G 
H 
5 4 
Numbers array length: 4 
G 
H 
5 
4 

爲什麼從文件中的數字沒有得到解析一樣在代碼中定義的相同字符串?

+1

該文件的內容是什麼? – Zarwan

+7

看起來文件中的最後一個空格不是空格 – njzk2

+1

找到一個十六進制編輯器並檢查文件中的實際內容。 '\ s'只匹配'\ t \ n \ x0B \ f \ r',但還有一些其他的「似乎是空白」的字符 –

回答

1

根據反饋,我將正則表達式更改爲split("[\\s\\h]+")解決了問題;該文件的編號被正確分割,這清楚地表明我在我使用的文本文件中有一個不同的空白字符。然後,我替換了文件的內容(使用記事本)並恢復爲split("\\s+"),並發現這次它正常工作。所以在某些時候,我必須在文件中引入不同的空白字符(可能是複製/粘貼問題)。最後,帶走我應該使用split("[\\s\\h]+")從我想分割空間的文件中讀取,因爲它將覆蓋更多可能不會立即顯而易見的場景。

感謝所有幫助我找到問題的根源。

+0

感謝您分享您的結論。這可能對其他人有幫助。 –

+0

我編輯了答案來解決正則表達式中無效的反斜槓轉義問題。 – tpttpttpt

相關問題