我有一个字符串像下面 -字符串标记:分割字符串用逗号,而忽略逗号双引号
值1,值2,值3,值4,“值5,1234”,value6,value7,“value8” ,value9,“value10,123.23”
如果我在上面的字符串上进行标记,我会得到用逗号分隔的标记。但我想说,字符串标记器在分割时忽略逗号在双引号之后。我怎么说这个?
在此先感谢
沙市
我有一个字符串像下面 -字符串标记:分割字符串用逗号,而忽略逗号双引号
值1,值2,值3,值4,“值5,1234”,value6,value7,“value8” ,value9,“value10,123.23”
如果我在上面的字符串上进行标记,我会得到用逗号分隔的标记。但我想说,字符串标记器在分割时忽略逗号在双引号之后。我怎么说这个?
在此先感谢
沙市
使用CSV解析器像OpenCSV照顾之类的东西逗号引述因素,自动跨越多行值等。您也可以使用该库将您的文本序列化为CSV。
String str = "value1, value2, value3, value4, \"value5, 1234\", " +
"value6, value7, \"value8\", value9, \"value10, 123.23\"";
CSVReader reader = new CSVReader(new StringReader(str));
String [] tokens;
while ((tokens = reader.readNext()) != null) {
System.out.println(tokens[0]); // value1
System.out.println(tokens[4]); // value5, 1234
System.out.println(tokens[9]); // value10, 123.23
}
您可以使用几种方法:即搜索昏迷和保持状态的天气特别的昏迷是在引号或笔记
你只需要一条线,右正则表达式:
String[] values = input.replaceAll("^\"", "").split("\"?(,|$)(?=(([^\"]*\"){2})*[^\"]*$) *\"?");
这也整齐地剪掉包装你双引号也包括最后的报价!
注意:当引用第一个条款时,有趣的边缘情况需要使用replaceAll()
修剪前导引号的额外步骤。
下面是一些测试代码:
String input= "\"value1, value2\", value3, value4, \"value5, 1234\", " +
"value6, value7, \"value8\", value9, \"value10, 123.23\"";
String[] values = input.replaceAll("^\"", "").split("\"?(,|$)(?=(([^\"]*\"){2})*[^\"]*$) *\"?");
for (String s : values)
System.out.println(s);
输出:
value1, value2
value3
value4
value5, 1234
value6
value7
value8
value9
value10, 123.23
没有任何第三方库的依赖关系,下面的代码也可以解析领域按给出的要求:
import java.util.*;
public class CSVSpliter {
public static void main (String [] args) {
String inputStr = "value1, value2, value3, value4, \"value5, 1234\", value6, value7, \"value8\", value9, \"value10, 123.23\"";
StringBuffer sb = new StringBuffer (inputStr);
List<String> splitStringList = new ArrayList<String>();
boolean insideDoubleQuotes = false;
StringBuffer field = new StringBuffer();
for (int i=0; i < sb.length(); i++) {
if (sb.charAt (i) == '"' && !insideDoubleQuotes) {
insideDoubleQuotes = true;
} else if (sb.charAt(i) == '"' && insideDoubleQuotes) {
insideDoubleQuotes = false;
splitStringList.add (field.toString().trim());
field.setLength(0);
} else if (sb.charAt(i) == ',' && !insideDoubleQuotes) {
// ignore the comma after double quotes.
if (field.length() > 0) {
splitStringList.add (field.toString().trim());
}
// clear the field for next word
field.setLength(0);
} else {
field.append (sb.charAt(i));
}
}
for (String str: splitStringList) {
System.out.println ("Split fields: "+str);
}
}
}
这将给以下的输出:
拆分领域:数值
拆分字段:值2
拆分领域:VALUE3
拆分领域:VALUE4
拆分字段: value5,1234
拆分字段:值6
拆分领域:value7
拆分领域:value8
拆分领域:value9
拆分字段:value10,123.23
String delimiter = ",";
String v = "value1, value2, value3, value4, \"value5, 1234\", value6, value7, \"value8\", value9, \"value10, 123.23\"";
String[] a = v.split(delimiter + "(?=(?:(?:[^\"]*+\"){2})*+[^\"]*+$)");
我过敏的正则表达式;为什么不像有人建议的那样分裂?
String str = "value1, value2, value3, value4, \"value5, 1234\", value6, value7, \"value8\", value9, \"value10, 123.23\"";
boolean quoted = false;
for(String q : str.split("\"")) {
if(quoted)
System.out.println(q.trim());
else
for(String s : q.split(","))
if(!s.trim().isEmpty())
System.out.println(s.trim());
quoted = !quoted;
}
使用CSV解析器?正则表达式会有点复杂。否则,发布你已经尝试过。 – Jerry
CSV解析器还可让您统一处理带引号/不带引号的值。 –