关于Java字符串操作

关于Java字符串操作,java,string,replaceall,Java,String,Replaceall,在split命令之后,我将字符串“MO”“RET”存储在项[1]数组中。在它被存储之后,我在这个字符串上做了一个replaceall,它替换了所有的双引号。 但我希望将其存储为MO“RET。如何操作。在使用split命令处理的csv文件中,文本字段内容中的双引号重复出现(例如:此帐户是“大”帐户)。所以我想保留字符串中的两个引号中的一个,如果它被重复,并且忽略如果存在的结束引号。我怎么做 String items[] = line.split(",(?=([^\"]*\"[^\"]*\")*[^

在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()检查并执行子字符串。无论如何,它将比正则表达式快。