2014-09-24 185 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* 
     (?: 
      (?= ,) 
     | $ 
    ) 
)