2014-09-24 206 views
0

我有一些Java中的字符串,它看起來像下面這樣:分割字符串

String s = ""Aac 1Zl Aachen",,DE,5048.850N,00611.483E,189.0m,1,,,,"AACHEN"" 

我想在每一個逗號分割字符串並分配分裂值的數組。但我無法弄清楚如何保持多個逗號之間的空值,它應該爲空。

結果數組應該是這樣的:

array[0] = ""Aac 1Zl Aachen"" 
    array[1] = null 
    array[2] = "DE" 
    array[3] = "5048.850N" 
    array[4] = "00611.483E" 
    array[5] = "189.0m" 
    array[6] = "1" 
    array[7] = null 
    array[8] = null 
    array[9] = null 
    array[10] = ""AACHEN"" 
+0

首先,您應該轉義那些引號......並查看字符串拆分 – user1071777 2014-09-24 14:29:49

+0

將字符串引號作爲值的一部分或分配NULL沒有任何好處。 – sln 2014-09-24 21:23:55

回答

2

您可以通過逗號和後處理所產生的陣列劃分:

String[] toks = 
     "\"Aac 1Zl Aachen\",,DE,5048.850N,00611.483E,189.0m,1,,,,\"AACHEN\"".split(","); 
for (int i=0; i<toks.length; i++) { 
    if ("".equals(toks[i])) 
     toks[i] = null; 
} 
+0

如果逗號位於引用字段內,它會起作用嗎? – sln 2014-09-24 17:16:46

+0

我可以很容易地寫一個正則表達式來照顧引號,但這不是問題的一部分。 – anubhava 2014-09-24 17:17:40

+0

我相信OP無法弄清楚如何保持多個逗號之間的空值,因爲'null'。 – anubhava 2014-09-24 17:23:46

2

您可以使用split,字符串的方法並替換爲空字符串with null

import java.util.Arrays; 

public class RegFun { 

    public static void main(String[] args) { 
     String s = "\"Aac 1Zl Aachen\",,DE,5048.850N,00611.483E,189.0m,1,,,,\"AACHEN\""; 
     String[] split = s.split(","); 

     for (int i = 0; i < split.length; i++) { 
      if (split[i].equals("")) { 
       split[i] = null; 
      } 
     } 

     System.out.println(Arrays.toString(split)); 
    } 
} 

輸出

["Aac 1Zl Aachen", null, DE, 5048.850N, 00611.483E, 189.0m, 1, null, null, null, "AACHEN"] 
0
String str = "This is String , split by StringTokenizer, created by mkyong"; 
       StringTokenizer st = new StringTokenizer(str, ",");//split by commas 
0

我不知道一個NULL是一個明確的解決方案,因爲在逗號的單獨拆分只是邀請
麻煩。可能的話,如果Java支持使用正則表達式的split(),那麼可以使用\s*,\s*

另一個更好的解決方案是使用一個真正的csv正則表達式,它不僅可以進行字段修整,還可以考慮逗號在引號內部的位置。後者,如果可能的話,使得使用分裂
站不住腳。

由於字段被修剪,所以不需要NULL作爲檢查,使用長度作爲替代。
在正則表達式jargin中,NULL表示該組不匹配任何內容。在數組jargin中,如在C/C++中一樣,
NULL表示未分配值的指針。使用修剪,消除歧義。

要做到這一點吧...

您可以使用此作爲發現所有正則表達式。每個值在組1或2中返回。
只是鏈接$1$2

每個字段也被裁剪(前/後)的空白。

# "\\G(?:(?:^|,)\\s*)(?:\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"|([^,]*?))(?:\\s*(?:(?=,)|$))" 

\G 
(?:       # leading comma + optional whitespaces 
     (?:^| ,) 
     \s* 
) 
(?:       # Cluster group 
     " 
     (       # (1), double quoted string data 
      [^"\\]* 
      (?: \\ . [^"\\]*)* 
    ) 
     " 
    |        # OR 
     ([^,]*?)     # (2), non-quoted field 
) 
(?:       # trailing optional whitespaces 
     \s* 
     (?: 
      (?= ,) 
     | $ 
    ) 
)