String Tokenizer:用逗号分隔字符串,用双引号忽略逗号

时间:2013-10-08 06:53:22

标签: java regex string

我有一个如下字符串 -

  

value1,value2,value3,value4,“value5,1234”,value6,value7,“value8”,value9,“value10,123.23”

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

提前致谢

沙市

6 个答案:

答案 0 :(得分:6)

使用像OpenCSV这样的CSV解析器来处理引用元素中的逗号,自动跨越多行等的值。您也可以使用该库将文本序列化为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 :(得分: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

答案 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;
    }

答案 3 :(得分:1)

您可以使用以下几种方法:

  1. 编写搜索昏迷的代码并维持状态天气特定的昏迷在引号或注释中。
  2. 使用双引号符号进行标记,然后使用逗号符号标记结果数组中的字符串(确保使用索引0,2,4等标记字符串,因为它们不是原始字符串中的双引号)< / LI>

答案 4 :(得分: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);
    }
}

}

这将提供以下输出:

  

拆分字段:value1

     

拆分字段:value2

     

拆分字段:value3

     

拆分字段:value4

     

拆分字段:value5,1234

     

拆分字段:value6

     

拆分字段:value7

     

拆分字段:value8

     

拆分字段:value9

     

拆分字段:value10,123.23

答案 5 :(得分:0)

String delimiter = ",";

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

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