2016-10-17 109 views
1

我寫了這個簡單的程序,它在每個非數字字符處分割一個給定的輸入。字符串分割錯誤的輸出

public class Fileread { 
    public static void main(String[] args) throws IOException { 
    //Declarations 
    String[] temp; 
    String current; 

    //Execution 
    BufferedReader br = new BufferedReader(new FileReader("input.txt")); 
    while ((current = br.readLine()) != null) { 
     temp = current.split("\\D"); //Splitting at Non Digits 
     for (int i = 0; i < temp.length; i++) { 
     System.out.println(temp[i]); 
     } 
    } 
    } 
} 

這是input.txt中:

hello1world2 
world3 
end4of5world6 

輸出:

1 




2 





3 



4 

5 




6 

爲什麼那麼多多餘的空格出現?我需要在一個單獨的行上打印每個數字,而沒有間隔。我怎樣才能解決這個問題?

+7

使用'\\ d +'圖案。但是,如果您的字符串以非數字開頭,則仍然可以保留前導空元素。 –

回答

1
//Declarations 
     String[] temp; 
     String current; 

     //Execution 
     BufferedReader br = new BufferedReader(new FileReader("d://input.txt")); 
     while ((current = br.readLine()) != null) { 
      temp = current.split("\\D+"); //Splitting at Non Digits 
      for (int i = 0; i < temp.length; i++) { 
       if (!temp[i].equalsIgnoreCase("")) { 
        System.out.println(temp[i]); 
       } 
      } 
     } 
+0

它工作!如果我把!temp [i] .equals(「」)不起作用。但是,如果我把!temp [i] .equalsIgnoreCase(「」)。有什麼不同?你可以解釋嗎? –

+0

我的壞...它的工作**!temp [i] .equals(「」)**也...沒有嘗試過......無論如何,謝謝:) –

4

它分裂在每個和每個非數字。

爲了治療的非數字字符的字符串作爲一個分隔符,指定

temp = current.split("\\D+"); 

代替。加上加號使模式匹配一​​個或多個連續的非數字字符。

0

Java的String#split方法將爲出現在兩個分隔符之間的每個點創建一個標記。請看下面的例子:

String s = "a,b,c,,,f"; 

因爲分隔符,沒事之間連續出現,s.split(",")輸出如下:

{"a", "b", "c", "", "", "f"} 

你會發現有此數組中有兩個空白的字符串;將插入一個空格來表示在每對連續逗號之間出現的令牌。基本上,該字符串被視爲a,b,c,(blank),(blank),f

解決方法是將連續的分隔符視爲單個分隔符。現在,重要的是要記住,您對split的論述實際上是一個正則表達式。所以,你可以包括+貪婪正則表達式量詞來告訴引擎匹配一個或多個連續的分隔符,並把它們作爲一個分割點:

s.split(",+") 

對於上面的例子中,這個現在得到以下(SANS空字符串):

{"a", "b", "c", "f"} 

您可以將類似的技術,以您正則表達式,使用\\D+

1

總之,使用

.replaceFirst("^\\D+","").split("\\D+") 

分割字符串以\D(非數字字符匹配圖案)指您一次匹配單個非數字字符,並在該打破串焦炭。當你需要拆分對塊字符的,你需要匹配多個連續字符,並在你的情況,你只需要\\D後添加+量詞

但是,這意味着如果您的字符串在字符串的開頭處有一個非數字(s),您仍然會在索引0處有一個空元素。解決方法是到刪除開始的子字符串與拆分模式

最終溶液是

List<String> strs = Arrays.asList("hello1world2", "world3", "end4of5world6"); 
for (String str : strs) { 
    System.out.println("---- Next string ----"); 
    String[] temp = str.replaceFirst("^\\D+","").split("\\D+"); 
    for (String s: temp) { 
     System.out.println(s); 
    } 
} 

參見online Java demo