java中带双引号的拆分字符串

java中带双引号的拆分字符串,java,string,Java,String,我用如下记录分隔文件 val1|"val2"|"val3|val4"|val5 我需要拆分记录,以便如果字段之间包含分隔符,则应将其引用。否则,如果字段不包含分隔符(|),则应忽略引号 输出应如下所示: col1=val1 col2=val2 col3="val3|val4" col4=val5 我修改了类似问题的答案,得到了下面的代码 String testData = "val1|"val2"|"val3|val4"|val5"; char quote = '"';

我用如下记录分隔文件

val1|"val2"|"val3|val4"|val5
我需要拆分记录,以便如果字段之间包含分隔符,则应将其引用。否则,如果字段不包含分隔符(|),则应忽略引号

输出应如下所示:

col1=val1
col2=val2
col3="val3|val4"
col4=val5
我修改了类似问题的答案,得到了下面的代码

String testData = "val1|"val2"|"val3|val4"|val5";
        char quote = '"';
        List<String> csvList = new ArrayList<String>();
        boolean inQuote = false;
        boolean delimInside = false;
        boolean isPrevQuoted = false;
        ;
        int lastStart = 0;
        for (int i = 0; i < testData.length(); i++) {
            if ((i + 1) == testData.length()) {

                if (inQuote && !delimInside) {

                    csvList.add(testData.substring(lastStart + 1, i));
                } else {
                    csvList.add(testData.substring(lastStart, i + 1));
                }
            }
            if (testData.charAt(i) == quote) {
                // if the character is quote
                if (inQuote) {
                    inQuote = false;
                    isPrevQuoted = true;
                    continue; // escape
                }
                inQuote = true;
                continue;
            }
            if (testData.charAt(i) == '|') {
                if (inQuote) {

                    delimInside = true;
                    continue;
                }
                if (isPrevQuoted && !delimInside) {

                    csvList.add(testData.substring(lastStart + 1, i - 1));
                } else {
                    csvList.add(testData.substring(lastStart, i));
                }

                delimInside = false;
                isPrevQuoted = false;
                lastStart = i + 1;
            }
        }
String testData=“val1 |“val2”|“val3 | val4”| val5”;
字符引号=“”;
List csvList=new ArrayList();
布尔inQuote=false;
布尔delimInside=false;
布尔值isPrevQuoted=false;
;
int lastStart=0;
对于(int i=0;i

我一直在寻找优雅的解决方案。提前感谢。

这里有一些使用和不使用正则表达式的示例。首先,将字符串拆分为

没有正则表达式,我使用
StringBuilder
,这样就不会创建太多字符串。我修剪
|
,并在适当时用
填充:

for (int i=0; i < strings.length; i++) {
    if (strings[i].equals("|"))
        continue;
    StringBuilder builder = new StringBuilder(strings[i]);
    if (strings[i].startsWith("|"))
        builder.deleteCharAt(0);
    if (strings[i].endsWith("|"))
        builder.deleteCharAt(builder.length()-1);
    if (builder.indexOf("|") != -1)
        builder.append("\"").insert(0, "\"");
    list.add(builder.toString());
}
Pattern pat = Pattern.compile("([^|]+(?:\\|.+)?)");

for (int i=0; i < strings.length; i++) {
    Matcher m = pat.matcher(strings[i]);
    while (m.find()) 
        if (m.group(1).contains("|"))
            list.add("\"".concat(m.group(1)).concat("\""));
        else
            list.add(m.group(1));
}

System.out.println(list)
之后,它们都有
[1,2,3,4,5,6,7,8”]
的输出。根据具体情况,可以使用或不使用
String
s而不是
StringBuilder

这甚至可以编译吗?如果我使用
String testData=“val1 | val2\”val3 | val4\”val5,它应该在这里工作";。问题是什么?是的,如果你用这个,这不是问题。很明显,他甚至没有尝试运行代码抱歉。实际上,我在格式化问题时用示例记录替换了代码testData。忘记了转义引号。错误:(有一个名为OpenCSV的开放源码库,对于这种类型的东西很方便。它需要一个分隔符(在本例中是管道)并尊重双引号字符串。它是开源的,所以你可以看到它们是如何分解字符串的。你可以在这里找到它。看起来不错。我忘了提到分隔符可以在column@arjun你是说
“var1 | var2 | var3”
?我们还需要知道什么吗?这就是所有要求。
for (int i=0; i < strings.length; i++) {
    if (strings[i].equals("|"))
        continue;
    StringBuilder builder = new StringBuilder(strings[i]);
    if (strings[i].startsWith("|"))
        builder.deleteCharAt(0);
    if (strings[i].endsWith("|"))
        builder.deleteCharAt(builder.length()-1);
    if (builder.indexOf("|") != -1)
        builder.append("\"").insert(0, "\"");
    list.add(builder.toString());
}
Pattern pat = Pattern.compile("([^|]+(?:\\|.+)?)");

for (int i=0; i < strings.length; i++) {
    Matcher m = pat.matcher(strings[i]);
    while (m.find()) 
        if (m.group(1).contains("|"))
            list.add("\"".concat(m.group(1)).concat("\""));
        else
            list.add(m.group(1));
}