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

Java 替换由一个或多个双引号括起的表达式中的逗号,java,string,replace,comma,double-quotes,Java,String,Replace,Comma,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();

我有一根这样的绳子

“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;

    }
publicstringgetresult(字符串输入)
{
字符串结果=”;
int计数器=0;

对于(int i=0;iAndreas是对的!您需要设置规则,确定如何创建要处理的字符串,当然,除非这是来自某个模糊数据文件(或源)的数据,而且您在这件事上真的没有任何选择,您的任务就是简单地解析它,并附上一个大大的“好运”

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

由于双引号在某种程度上起着括号的作用,因此您需要做的第一件事是确保提供的数据字符串实际上是按照规则播放的,如果不是,那么就不要因为…它是作弊,而不是按照规则播放而烦恼了。:)。要做到这一点,我们需要确保数据字符串中包含偶数对双引号,就像打开/关闭括号对一样,这里有一种方法:

// 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(" ", "");
最终将数据字符串的内容更改为:

"val1,\"val2,\"val3,val4\"\",\"val5,val6\"";
对我来说,如果以后不必担心很多不同的间隔条件,那么使用它就更容易了,因为我们要做的就是解析最终的结果字符串

现在,我可以立即想到的最简单的方法是使用string.split()方法从字符串中的引号或双引号中快速提取数据进行处理:

String[] ss = dataString.split("\"");
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;
}
我们刚刚创建的字符串数组(包含在ss变量中)实际上帮助我们确定所提供的数据字符串的哪些部分包含在双引号之间。我们只需要实现这一点并相应地处理数据。第一步是声明一个名为res的结果字符串变量(稍后解析)同时,我们将使用解析数据字符串中的第一个元素对其进行初始化,它实际上不会在我们的处理中起任何作用,只会开始生成结果字符串。如果提供的数据字符串中的第一部分数据位于双引号之间,如中所示:

"\"val1\" , \"val2 , \" val3, val4\" \" , \" val5,val6 \""
我们使用string.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(",", "-"); }
}
parsedData数组将包含…您所需的解析数据,以便按照您的意愿进行处理。整个方法如下所示(我们称之为parseQuotedData()方法):

私有静态字符串[]parseQuotedData(字符串数据字符串){
//确保有偶数个双引号。。。
如果(((dataString.length()-dataString.replace(“\”,“).length())&1)!=0{
//否…因此通知用户(通过控制台窗口)并退出方法。
System.out.println(“\u001B[31m***错误!***\n\u001B[31m双引号对”
+“提供的数据字符串不匹配!\n数据字符串:\u001B[34m”+
数据字符串+“\n”);
返回null;
}
//从数据字符串中删除空白。
dataString=dataString.replace(“,”);
//在每个双引号处拆分(分析)数据字符串
//放入名为ss的数组中。。。
String[]ss=dataString.split(“\”);
//声明要从此方法返回的结果字符串,然后
//使用解析后的第一个元素初始化它
//数据字符串。
字符串res=ss[0];
//迭代分割数据的其余部分,然后
//处理双引号之间包含的逗号。
对于(int i=1;i
您可以这样使用此方法:

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]);
}
String[]myData=parseQuotedData(“val1,\“val2,\“val3,val4\”,“val5,val6\”);
System.out.println(“\n我解析的数据字符串:\n=========================”;
对于(int i=0;i
你尝试过什么吗?你自己尝试过吗?是的,我尝试过,但对我不起作用code@Elsayed我知道,但是你怎么知道它是
(())()
而且不是
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]);
}