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

时间:2016-12-10 18:55:25

标签: java string replace comma double-quotes

我有一个像这样的字符串

  

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

我想在此输出中替换逗号

  

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

我试图解决这个问题

{{1}}

但它没有工作

1 个答案:

答案 0 :(得分:1)

安德烈亚斯是对的!您需要设置关于如何创建要处理的字符串的规则,除非这是来自某些模糊数据文件(或来源)的数据,并且您真的无法选择此类事项并且您任务是简单地用一个大的" 祝你好运"附在它上面。

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

由于双引号在某种程度上就像括号一样,你需要做的第一件事就是确保所提供的数据字符串实际上是按照规则播放的,如果它不是,那么只需要#39打扰它只是因为......它的作弊而不是遵守规则:)。要做到这一点,我们需要确保数据字符串中包含偶数双引号,就像打开/关闭括号对一样,这是一种方法:

// 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;
}
  

注意:上面的字符串消息被发送到控制台窗口   包含用于更改文本显示颜色的转义颜色代码   (" \ u001B [31m "和" \ 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()方法分开,然后我们从分割创建的数组的第一个元素将是一个空字符串( "" )无论如何,我们将通过以下 for 循环创建我们的结果字符串。包含Null String的数组元素在 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 循环中包含的条件进行一些调整,以处理您仍未与我们分享的所有规则。

现在你需要做的就是解析结果字符串变量( 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]);
}