2012-09-12 29 views
5

我有一個看似簡單的分割一個逗號的問題分開String爲標記,由此,輸出應包括在箱子空令牌的字符串,其中:Tokenising含有空令牌

  • String的第一個字符是一個逗號。
  • String中的最後一個字符是逗號。
  • 連續出現兩個逗號。

例如,對於String",abd,def,,ghi,"應產生的輸出:{"", "abd", "def", "", "ghi", ""}

我嘗試過使用String.split,ScannerStringTokenizer,但每個都給出了不同的不希望的輸出(下面的例子)。任何人都可以建議一個優雅的解決方案,最好使用JDK類?顯然,我可以自己編寫一些代碼,但我覺得我錯過了上述三種方法之一。請注意,分隔符是固定的String,但不一定是逗號,也不是單個字符。

示例代碼

import java.util.*; 

public class Main12 { 
    public static void main(String[] args) { 
    String s = ",abd,def,,ghi,"; 
    String[] tokens = s.split(","); 

    System.err.println("--- String.split Output ---"); 
    System.err.println(String.format("%s -> %s", s, Arrays.asList(tokens))); 

    for (int i=0; i<tokens.length; ++i) { 
     System.err.println(String.format("tokens[%d] = %s", i, tokens[i])); 
    } 

    System.err.println("--- Scanner Output ---"); 

    Scanner sc = new Scanner(s); 
    sc.useDelimiter(","); 
    while (sc.hasNext()) { 
     System.err.println(sc.next()); 
    } 

    System.err.println("--- StringTokenizer Output ---"); 

    StringTokenizer tok = new StringTokenizer(s, ","); 
    while (tok.hasMoreTokens()) { 
     System.err.println(tok.nextToken()); 
    } 
    } 
} 

輸出

$ java Main12 
--- String.split Output --- 
,abd,def,,ghi, -> [, abd, def, , ghi] 
tokens[0] = 
tokens[1] = abd 
tokens[2] = def 
tokens[3] = 
tokens[4] = ghi 
--- Scanner Output --- 
abd 
def 

ghi 
--- StringTokenizer Output --- 
abd 
def 
ghi 

回答

12

傳遞一個-1split作爲limit參數:

String s = ",abd,def,,ghi,"; 
String[] tokens = s.split(",", -1); 

然後您的結果數組將包含任何尾隨的空字符串。

javadocs

如果[極限]非正則模式將被應用多次可能的,並且陣列可以具有任意長度。如果[限制]爲零,那麼該模式將盡可能多次應用,數組可以有任何長度,並且尾隨的空字符串將被丟棄。

split(regex)調用充當如果limit參數是0,所以拖尾空字符串被丟棄。