替换一个或多个双引号括起的表达式中的逗号

Replacing comma found in an expression enclosed by one or more double quotes

我有这样的字符串

" val1 , \"val2 , \" val3, val4\" \" , \" val5,val6 \""

我想替换此输出中的逗号

val1 , " val2 - " val3-val4 " " , " val5-val6 "

我正在尝试解决这个问题

public  String getResult(String input)
    {
         String result="";
         int counter=0;
         for(int i=0; i<input.length(); i++)
         {
             if(input.charAt(i)=='"')
             {
                 counter++;
                 result =result+input.charAt(i);

             }
             else if(input.charAt(i)==',' && counter%2!=0)
             {
                 result=result+'-';
             }
             else 
             {
                 result=result+input.charAt(i);
             }
         }
         return result;

    }

但是没用

Andreas 是对的!您需要设置有关如何创建要处理的字符串的规则,除非当然这是来自一些晦涩的数据文件(或源)的数据,并且您在这件事上真的别无选择,您的任务是简单地用一个大的“祝你好运”解析出来。

从表面上看,参与规则是:如果在双引号字符之间(内)或嵌套双引号字符之间包含的任何文本中有逗号分隔符 (,),则将该逗号分隔符更改为一个连字符 (-)。

由于双引号在某种程度上就像括号一样,您需要做的第一件事就是确保提供的数据字符串实际上是按照规则播放的,如果不是,那就不要打扰它只是因为......它是作弊而不是按规则玩 :)。为此,我们需要确保数据字符串中甚至包含双引号对,就像 open/close 对括号一样,这是一种方法:

// Make sure there is an even number of double-quotes...
if (((dataString.length() - dataString.replace("\"", "").length()) & 1) != 0) { 
    // No...so inform User (via console window) and Exit method.
    System.out.println("\u001B[31m*** ERROR! ***\n\u001B[31mDouble-Quote Pairs "
            + "Mismatch In Supplied Data String!\nData String: \u001B[34m" + 
            dataString + "\n");
    return null;
}

Note: The string message above which is sent to console window contains escaped color codes for changing the displayed colors of text ("\u001B[31m" and "\u001B[34m").

如果我们有偶数个双引号字符,那么显然我们有匹配的双引号对。有了这个,我们就可以继续检索每对引号之间的字符串数据,并对数据进行必要的修改,以便我们稍后可以正确地解析它。现在最简单的事情就是从字面上从提供的数据字符串中删除所有那些该死的空间。当我们解析这些数据时,我们可能不需要它们,但是嘿,如果你这样做了,那就忘记这一步:

dataString = dataString.replaceAll(" ", "");

最终会将 dataString 变量的内容更改为:

"val1,\"val2,\"val3,val4\"\",\"val5,val6\"";

对我来说,如果您以后不必担心许多不同的间距条件,那么使用它会更容易,因为无论如何我们要做的就是解析最终结果字符串。

现在,我能想到的最简单的方法是使用 String.split()方法:

String[] ss = dataString.split("\"");

我们刚刚创建的字符串数组(包含在 ss 变量中)实际上帮助我们确定了提供的数据字符串的哪些部分包含在双引号之间。我们只需要意识到这一点并相应地处理数据。第一步是声明一个结果字符串变量,方便地命名为 res(稍后解析),同时我们将使用已解析数据字符串中的第一个元素对其进行初始化,除了开始构造我们的结果字符串之外,它在我们的处理中实际上没有任何作用。如果提供的数据字符串中的第一部分数据在双引号之间,如:

"\"val1\" , \"val2 , \" val3, val4\" \" , \" val5,val6 \""

然后我们使用 String.split() 方法拆分提供的数据字符串,使用双引号作为分隔符,然后我们从创建的数组的第一个元素split 将是一个空字符串 (""") 无论如何,这对我们将要使用以下 for 创建的结果字符串没有任何作用环形。包含空字符串的数组元素在此 for 循环中处理,如下所示:

for (int i = 1; i < ss.length; i++) {
    if (ss[i].equals("") || ss[i].equals(",")) { res+= ss[i]; }
    else { res+= ss[i].replace(",", "-"); }
}

结果字符串变量 (res) 的声明和初始化以及这个小的 for 循环将创建我们需要的字符串根据您提供的规则正确解析提供的数据字符串,至少在大多数情况下是这样。您可能需要对 for 循环中包含的条件进行一些调整,以处理您尚未与我们共享的所有规则。

您现在需要做的就是解析结果字符串变量 (res) 以获取您想要的数据,是的,您只需使用 String.split() 再次执行此操作:

String[] parsedData = res.split(",")
return parsedData;

parsedData 数组将包含....您需要的解析数据,您可以根据需要进行处理。整个方法看起来像这样(我们称它为 parseQuotedData() 方法):

private static String[] parseQuotedData(String dataString) {
    // Make sure there is an even number of double-quotes...
    if (((dataString.length() - dataString.replace("\"", "").length()) & 1) != 0) { 
        // No...so inform User (via console window) and Exit method.
        System.out.println("\u001B[31m*** ERROR! ***\n\u001B[31mDouble-Quote Pairs "
                + "Mismatch In Supplied Data String!\nData String: \u001B[34m" + 
                dataString + "\n");
        return null;
    }

    // Remove whitespaces from Data String.
    dataString = dataString.replace(" ", "");

    // Split (parse) the data string at each double-quote
    // into an array named ss ...
    String[] ss = dataString.split("\"");

    // Declare a result string to return from this method and
    // initialize it with the first element from our parsed 
    // data string. 
    String res = ss[0];

    // Iterate through the remainder of the split data and 
    // deal with the commas contained between double-quotes.
    for (int i = 1; i < ss.length; i++) {
        if (ss[i].equals("") || ss[i].equals(",")) { res+= ss[i]; }
        else { res+= ss[i].replace(",", "-"); }

    }

    // Delete the following if you don't want it...
    System.out.println("My Result String:  \u001B[34m" + res);

    // Parse and return data...
    String[] parsedData = res.split(",");
    return parsedData;
}

您可以像这样使用此方法:

String[] myData = parseQuotedData("val1 , \"val2 , \" val3, val4\" \" , \" val5,val6 \"");

System.out.println("\nMy Parsed Data String:\n======================");
for (int i = 0; i < myData.length; i++) {
    System.out.println(myData[i]);
}