关于Java String Manipulation

我将字符串"MO""RET"存储在split命令之后的items[1]数组中。 在它存储之后,我对此字符串执行replaceall并替换所有双引号。 但我希望它存储为MO"RET 。我该怎么做。在csv文件中我使用split命令处理文本字段内容中的双引号重复(例如:此帐户是""large""一个“)。 所以我想保留字符串中间的两个引号之一,如果它重复,并忽略最终引号(如果存在)。 我该怎么做?

 String items[] = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"); items[1] has "MO""RET" String recordType = items[1].replaceAll("\"",""); 

在这个rec​​ordType有MORET我希望它有MO"RET

不要使用正则表达式来拆分CSV行。 这是在寻找麻烦;)只是逐个字符地解析它。 这是一个例子:

 public static List> parseCsv(InputStream input, char separator) throws IOException { BufferedReader reader = null; List> csv = new ArrayList>(); try { reader = new BufferedReader(new InputStreamReader(input, "UTF-8")); for (String record; (record = reader.readLine()) != null;) { boolean quoted = false; StringBuilder fieldBuilder = new StringBuilder(); List fields = new ArrayList(); 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; } 

是的,涉及的正则表达式很少,但它只会修剪结束分隔符和单个字段的周围引号。

但是,您也可以使用任何第三方Java CSV API 。

怎么样:

 String recordType = items[1].replaceAll( "\"\"", "\"" ); 

我更喜欢你用replace而不是replaceAll。 replaceAll使用REGEX作为第一个参数。

要求是用一个QUOTE替换两个连续的QUOTES

 String recordType = items[1].replace( "\"\"", "\"" ); 

要查看replace和replaceAll之间的区别,请执行以下代码

 recordType = items[1].replace( "$$", "$" ); recordType = items[1].replaceAll( "$$", "$" ); 

在这里,您可以使用正则表达式。

 recordType = items[1].replaceAll( "\\B\"", "" ); recordType = recordType.replaceAll( "\"\\B", "" ); 

第一个语句用空字符替换单词开头的引号。 第二个语句用空字符替换单词末尾的引号。