2010-09-21 88 views
8

我試圖使用字符串分割不返回空的結果

"value1:value2::value3".split(":"); 

問題是,我希望它包括空白結果。

它返回:[value1, value2, value3]
它應該是:[value1, value2, , value3]

有誰知道正則表達式來解決這一問題?

好吧,我發現問題的原因。實際上,我讀的文本文件,它包含這一行:

123:;~\&:ST02:M:test:M:4540145::type;12:51253:D:2.2:567766::AL:::::::2.2b 

當我處理這條線讀取它產生上述錯誤結果的文本文件,這是不包括在任何情況下,空的結果喜歡這個: :::::。

但是,當我在測試程序中使用上述行時,它不會編譯,我得到一個「無效的轉義序列」。我認爲它是因爲「\ &」。

是否有解決這個問題的方法是使用正則表達式?

回答

18

split不包括在結果空場比賽,看看在docs here。但是,默認情況下,尾隨空字符串(數組末尾的那些)將被丟棄。如果您還想包括這些,請嘗試split(":", -1)

+0

謝謝......添加-1實際解決了從文本文件讀取時出現的特殊字符問題。它還包括空字符串。 – Marquinio 2010-09-23 16:24:47

+1

文檔鏈接不起作用。 – 2015-01-30 21:50:40

1

我不誠實地看到分裂的大抽獎。 StringTokenizer對於這樣的大多數事情也同樣適用,並且可以輕鬆地發回令牌(所以你可以知道::之間沒有任何內容)。

我只是希望它對增強型for循環有更好的效果,但除此之外,嘗試一下也不會有什麼壞處。

我認爲有一個正則表達式技巧來讓你的匹配標記返回,但我已經走了20年沒有學習正則表達式,它仍然不是我解決的任何問題的最佳答案(不是我會因爲我從未使用它,但非正則表達式解決方案通常太容易被擊敗。)

2

我認爲StringTokenizer可能對您更好,YMMV。

+0

不要使用的StringTokenizer請。 Oracle建議使用split方法。這是StringTokenizer文檔的一部分頁面: 'StringTokenizer是一個遺留類,由於兼容性原因而被保留,儘管在新代碼中不鼓勵使用它。建議任何尋求此功能的人都使用String或java.util.regex包的拆分方法。 – 2015-01-30 21:52:51

4

適合我。

class t { 
    public static void main(String[] _) { 
     String t1 = "value1:value2::value3"; 
     String[] t2 = t1.split(":"); 
     System.out.println("t2 has "+t2.length+" elements"); 
     for (String tt : t2) System.out.println("\""+tt+"\""); 
    } 
} 

使輸出

$ java t 
t2 has 4 elements 
"value1" 
"value2" 
"" 
"value3" 
1

在拆分語句中使用負極限:

String str = "val1:val2::val3"; 
String[] st = str.split(":", -1); 
for (int i = 0; i< st.length; i++) 
    System.out.println(st[i]); 

結果:

val1 
val2 

val3 
1
public static void main(String[] args){ 
    String[] arr = "value1:value2::value3".split(":"); 
    for(String elm:arr){ 
    System.out.println("'"+elm+"',"); 
    } 
    System.out.println(arr.length); 
} 

打印

'value1', 
'value2', 
'', 
'value3', 
4 

這是你想要什麼。你的錯誤在別的地方...

0

這應該工作,但如果您仍然有問題,請給StringTokenizer

1

使用GuavaSplitter類:

Iterable<String> split = Splitter.on(':').split("value1:value2::value3"); 

Splitter默認情況下不忽略空的結果,但你可以做一個沒有。儘管從其他人的看法來看,你所做的事情也應該如此。

0

這工作,

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

public class split { 
public static void main(String[] args) 
{ 
    String data = null; 
    try { 
    BufferedReader br = new BufferedReader(new FileReader(new File("split.csv"))); 
    while((data=br.readLine())!=null) 
    { 
     System.out.println("line:"+data); 
     String[] cols = data.split(":",-1); 
     System.out.println("count:"+cols.length); 
     for(int x=0;x<cols.length;++x) 
     { 
      System.out.println("["+x+"] =("+cols[x]+")"); 
     } 
    } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 

下面是測試文件,

a:b:c:d:e 
a:b:c:d: 
a:b:c:: 
a:b::: 
a:::: 
:::: 
::::e 
:::d:e 
::c:d:e 
:b:c:d:e 
a:b:c:d:e