关于Java字符串操作
在split命令之后,我将字符串关于Java字符串操作,java,string,replaceall,Java,String,Replaceall,在split命令之后,我将字符串“MO”“RET”存储在项[1]数组中。在它被存储之后,我在这个字符串上做了一个replaceall,它替换了所有的双引号。 但我希望将其存储为MO“RET。如何操作。在使用split命令处理的csv文件中,文本字段内容中的双引号重复出现(例如:此帐户是“大”帐户)。所以我想保留字符串中的两个引号中的一个,如果它被重复,并且忽略如果存在的结束引号。我怎么做 String items[] = line.split(",(?=([^\"]*\"[^\"]*\")*[^
“MO”“RET”
存储在项[1]
数组中。在它被存储之后,我在这个字符串上做了一个replaceall,它替换了所有的双引号。
但我希望将其存储为MO“RET
。如何操作。在使用split命令处理的csv文件中,文本字段内容中的双引号重复出现(例如:此帐户是“大”
帐户)。所以我想保留字符串中的两个引号中的一个,如果它被重复,并且忽略如果存在的结束引号。我怎么做
String items[] = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
items[1] has "MO""RET"
String recordType = items[1].replaceAll("\"","");
在这个记录类型具有MORET
之后,我希望它具有MO”RET
如何:
String recordType = items[1].replaceAll( "\"\"", "\"" );
不要使用正则表达式拆分CSV行。这是自找麻烦;)只需逐个字符解析即可。以下是一个示例:
public static List<List<String>> parseCsv(InputStream input, char separator) throws IOException {
BufferedReader reader = null;
List<List<String>> csv = new ArrayList<List<String>>();
try {
reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
for (String record; (record = reader.readLine()) != null;) {
boolean quoted = false;
StringBuilder fieldBuilder = new StringBuilder();
List<String> fields = new ArrayList<String>();
for (int i = 0; i < record.length(); i++) {
char c = record.charAt(i);
fieldBuilder.append(c);
if (c == '"') {
quoted = !quoted;
}
if ((!quoted && c == separator) || i + 1 == record.length()) {
fields.add(fieldBuilder.toString().replaceAll(separator + "$", "")
.replaceAll("^\"|\"$", "").replace("\"\"", "\"").trim());
fieldBuilder = new StringBuilder();
}
if (c == separator && i + 1 == record.length()) {
fields.add("");
}
}
csv.add(fields);
}
} finally {
if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
}
return csv;
}
public static List parseCsv(InputStream输入,字符分隔符)引发IOException{
BufferedReader reader=null;
List csv=新的ArrayList();
试一试{
读卡器=新的BufferedReader(新的InputStreamReader(输入,“UTF-8”));
for(字符串记录;(记录=reader.readLine())!=null;){
布尔引号=假;
StringBuilder fieldBuilder=新的StringBuilder();
列表字段=新的ArrayList();
对于(int i=0;i
是的,这里很少涉及正则表达式,但它只修剪了单个字段的结尾分隔符和周围的引号
但是,您也可以获取任何第三方。我希望您使用replace而不是replaceAll。 replaceAll使用REGEX作为第一个参数 要求将两个连续的报价替换为一个报价
String recordType = items[1].replace( "\"\"", "\"" );
要查看replace和replaceAll之间的差异,请执行下面的代码
recordType = items[1].replace( "$$", "$" );
recordType = items[1].replaceAll( "$$", "$" );
这里可以使用正则表达式
recordType = items[1].replaceAll( "\\B\"", "" );
recordType = recordType.replaceAll( "\"\\B", "" );
第一条语句将单词开头的引号替换为空字符。
“第二个声明”将单词末尾的引号替换为空字符。不到一小时前,你发布了一个非常类似的问题,你没有回答、否决、投票或接受。如果你不回馈网站,人们将停止回馈。@Mark Byers:哦,我多么希望这是真的。非常感谢。如果我的tring的值为“TEST”REPLA。如果只有一个单一的双引号在中间的字符串如何删除第一个,最后一个报价,并保留所有中间报价。我希望输出为TEST“REPLA示例2:“EXAM”PLE“2IN”我希望输出为EXAM“PLE”2IN,在第一个和最后一个引号中需要删除Hanks很多。非常感谢。如果my字符串的值为“TEST”REPLA。如果只有一个单一的双引号在中间的字符串如何删除第一个,最后一个报价,并保留所有中间报价。我希望输出为TEST“REPLA Example 2:“EXAM”PLE“2IN”我希望输出为EXAM“PLE”2IN,在第一个和最后一个引号中需要删除发布的代码示例已经这样做了(假设您的CSV文件符合此处概述的RFC4180)。我使用了您的代码。太好了!嗯…有一个小问题。我预期
[“a”,“B”,““”,”“,”“]
来自电子表格导出文件的A,B,,
行,但我得到了[“A”,“B”,““”]
。@Paul:哦,我忽略了边缘情况。我更新了答案。非常感谢。如果我的字符串的值为“TEST”REPLA。如果只有一个单一的双引号在中间的字符串如何删除第一个,最后一个报价,并保留所有中间报价。我希望输出为TEST“REPLA示例2:“EXAM”PLE“2IN”我希望输出为EXAM“PLE”“2在第一个和最后一个报价中,需要删除。使用regex很难做到这一点,并且包括有一个起始报价和没有结束报价的情况,等等。。正则表达式开始变得非常复杂。你真的开始更好地分析整条线了。如果您真的只需要特定的开始/结束引号,那么只需使用charAt()检查并执行子字符串。无论如何,它将比正则表达式快。