2013-10-08 177 views
5

我有一个字符串像下面 -字符串标记:分割字符串用逗号,而忽略逗号双引号

值1,值2,值3,值4,“值5,1234”,value6,value7,“value8” ,value9,“value10,123.23”

如果我在上面的字符串上进行标记,我会得到用逗号分隔的标记。但我想说,字符串标记器在分割时忽略逗号在双引号之后。我怎么说这个?

在此先感谢

沙市

+11

使用CSV解析器?正则表达式会有点复杂。否则,发布你已经尝试过。 – Jerry

+0

CSV解析器还可让您统一处理带引号/不带引号的值。 –

回答

6

使用CSV解析器像OpenCSV照顾之类的东西逗号引述因素,自动跨越多行值等。您也可以使用该库将您的文本序列化为CSV。

String str = "value1, value2, value3, value4, \"value5, 1234\", " + 
     "value6, value7, \"value8\", value9, \"value10, 123.23\""; 

CSVReader reader = new CSVReader(new StringReader(str)); 

String [] tokens; 
while ((tokens = reader.readNext()) != null) { 
    System.out.println(tokens[0]); // value1 
    System.out.println(tokens[4]); // value5, 1234 
    System.out.println(tokens[9]); // value10, 123.23 
} 
1

您可以使用几种方法:即搜索昏迷和保持状态的天气特别的昏迷是在引号或笔记

  1. 编写代码。
  2. 使用双引号符号进行标记并使用逗号符号对结果数组中的字符串进行标记(请确保使用索引0,2,4等对字符串进行标记化,因为它们不是原始字符串中的双引号)
2

你只需要一条线,右正则表达式:

String[] values = input.replaceAll("^\"", "").split("\"?(,|$)(?=(([^\"]*\"){2})*[^\"]*$) *\"?"); 

这也整齐地剪掉包装你双引号也包括最后的报价!

注意:当引用第一个条款时,有趣的边缘情况需要使用replaceAll()修剪前导引号的额外步骤。

下面是一些测试代码:

String input= "\"value1, value2\", value3, value4, \"value5, 1234\", " + 
    "value6, value7, \"value8\", value9, \"value10, 123.23\""; 
String[] values = input.replaceAll("^\"", "").split("\"?(,|$)(?=(([^\"]*\"){2})*[^\"]*$) *\"?"); 
for (String s : values) 
System.out.println(s); 

输出:

value1, value2 
value3 
value4 
value5, 1234 
value6 
value7 
value8 
value9 
value10, 123.23 
+0

第一个字符串用引号括起来时不起作用。 – gshauger

+1

@gshauger有趣...看编辑回答 – Bohemian

1

没有任何第三方库的依赖关系,下面的代码也可以解析领域按给出的要求:

import java.util.*; 

public class CSVSpliter { 

    public static void main (String [] args) { 
    String inputStr = "value1, value2, value3, value4, \"value5, 1234\", value6, value7, \"value8\", value9, \"value10, 123.23\""; 

    StringBuffer sb = new StringBuffer (inputStr); 
    List<String> splitStringList = new ArrayList<String>(); 
    boolean insideDoubleQuotes = false; 
    StringBuffer field = new StringBuffer(); 

    for (int i=0; i < sb.length(); i++) { 
     if (sb.charAt (i) == '"' && !insideDoubleQuotes) { 
      insideDoubleQuotes = true; 
     } else if (sb.charAt(i) == '"' && insideDoubleQuotes) { 
      insideDoubleQuotes = false; 
      splitStringList.add (field.toString().trim()); 
      field.setLength(0); 
     } else if (sb.charAt(i) == ',' && !insideDoubleQuotes) { 
      // ignore the comma after double quotes. 
      if (field.length() > 0) { 
       splitStringList.add (field.toString().trim()); 
      } 
      // clear the field for next word 
      field.setLength(0); 
     } else { 
      field.append (sb.charAt(i)); 
     } 
    } 
    for (String str: splitStringList) { 
     System.out.println ("Split fields: "+str); 
    } 
} 

}

这将给以下的输出:

拆分领域:数值

拆分字段:值2

拆分领域:VALUE3

拆分领域:VALUE4

拆分字段: value5,1234

拆分字段:值6

拆分领域:value7

拆分领域:value8

拆分领域:value9

拆分字段:value10,123.23

0
String delimiter = ","; 

String v = "value1, value2, value3, value4, \"value5, 1234\", value6, value7, \"value8\", value9, \"value10, 123.23\""; 

String[] a = v.split(delimiter + "(?=(?:(?:[^\"]*+\"){2})*+[^\"]*+$)"); 
2

我过敏的正则表达式;为什么不像有人建议的那样分裂?

String str = "value1, value2, value3, value4, \"value5, 1234\", value6, value7, \"value8\", value9, \"value10, 123.23\""; 
    boolean quoted = false; 
    for(String q : str.split("\"")) { 
     if(quoted) 
      System.out.println(q.trim()); 
     else 
      for(String s : q.split(",")) 
       if(!s.trim().isEmpty()) 
        System.out.println(s.trim()); 
     quoted = !quoted; 
    } 
相关问题