安德烈亚斯是对的!您需要设置有关如何创建要处理的字符串的规则,除非这是来自某些晦涩的数据文件(或源)的数据,并且您在这件事上真的别无选择,而您的任务是简单地解析它并附加一个大的“祝你好运”。
从表面上看,参与规则是:如果包含在(内)双引号字符或嵌套双引号字符之间的任何文本中包含逗号分隔符 (,),则将该逗号分隔符更改为连字符(-)。
由于双引号在某种程度上就像括号一样,所以您需要做的第一件事是确保提供的数据字符串实际上是按照规则播放的,如果不是,那么就不要打扰只是因为...这是作弊,不遵守规则:)。为此,我们需要确保数据字符串中包含偶数对双引号,就像使用开/关括号对一样,这是执行此操作的一种方法:
// 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() 方法: p>
String[] ss = dataString.split("\"");
我们刚刚创建的字符串数组(包含在 ss 变量中)实际上帮助我们确定了所提供数据字符串的哪些部分包含在双引号之间。我们只需要意识到这一点并相应地处理数据。第一步是声明一个名为 res 的结果字符串变量(以便稍后解析),同时我们将使用已解析数据字符串中的第一个元素对其进行初始化,它真的除了开始组成我们的结果字符串之外,它在我们的处理中没有任何作用。如果提供的数据字符串中的第一部分数据在双引号之间,如下所示:
"\"val1\" , \"val2 , \" val3, val4\" \" , \" val5,val6 \""
我们使用 String.split() 方法使用双引号作为分隔符拆分提供的数据字符串,然后我们从拆分创建的数组的第一个元素将是 Null 字符串 ( "") 无论如何这对我们将要使用以下 for 循环创建的结果字符串没有任何作用。包含 Null 字符串的数组元素在此 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]);
}