Java 如何解析具有文本限定符的字符串

Java 如何解析具有文本限定符的字符串,java,string,Java,String,如何解析字符串str=“abc,\”def,ghi\” 这样我得到的输出是 String[] strs = {"abc", "\"def,ghi\""} i、 e.长度为2的数组 我应该使用正则表达式,还是在JavaAPI或任何其他开源软件中有任何方法 哪个项目让我这么做 已编辑 为了给出这个问题的上下文,我正在阅读一个文本文件,其中每行有一个记录列表。每个记录都有由分隔符(逗号或分号)分隔的字段列表。现在我有一个要求,我必须支持excel或OpenOffice支持的文本限定符。假设我有记录

如何解析字符串str=“abc,\”def,ghi\”

这样我得到的输出是

String[] strs = {"abc", "\"def,ghi\""}
i、 e.长度为2的数组

我应该使用正则表达式,还是在JavaAPI或任何其他开源软件中有任何方法

哪个项目让我这么做

已编辑

为了给出这个问题的上下文,我正在阅读一个文本文件,其中每行有一个记录列表。每个记录都有由分隔符(逗号或分号)分隔的字段列表。现在我有一个要求,我必须支持excel或OpenOffice支持的文本限定符。假设我有记录

abc,“def,ghi”

在这里,是我的分隔符,“是我的文本限定符,当我解析这个字符串时,我应该得到两个字段abc和def,ghi而不是{abc,def,ghi}”

希望这能满足我的要求

谢谢


谢哈尔

这个问题似乎很恰当:


沿着这条路线,似乎是合适的。

基本算法并不太复杂:

 public static List<String> customSplit(String input) {
   List<String> elements = new ArrayList<String>();       
   StringBuilder elementBuilder = new StringBuilder();

   boolean isQuoted = false;
   for (char c : input.toCharArray()) {
     if (c == '\"') {
        isQuoted = !isQuoted;
        // continue;        // changed according to the OP comment - \" shall not be skipped
     }
     if (c == ',' && !isQuoted) {
        elements.add(elementBuilder.toString().trim());
        elementBuilder = new StringBuilder();
        continue;
     }
     elementBuilder.append(c); 
   }
   elements.add(elementBuilder.toString().trim()); 
   return elements;
}
公共静态列表customSplit(字符串输入){
列表元素=新的ArrayList();
StringBuilder elementBuilder=新的StringBuilder();
布尔值isquote=false;
for(char c:input.toCharArray()){
如果(c=='\'){
isQuoted=!isQuoted;
//continue;//根据OP注释更改-\”不应被跳过
}
如果(c==','&&&!带引号){
添加(elementBuilder.toString().trim());
elementBuilder=新的StringBuilder();
继续;
}
elementBuilder.append(c);
}
添加(elementBuilder.toString().trim());
返回元素;
}
试试这个-

 String str = "abc, \"def,ghi\"";
            String regex = "([,]) | (^[\"\\w*,\\w*\"])";
            for(String s : str.split(regex)){
                System.out.println(s);
            }
尝试:

List res=newlinkedlist();
String[]chunks=str.split(“\\\”);
if(chunks.length%2==0){
//不匹配的转义引号!
}
for(int i=0;i
这只会分割不在转义引号之间的部分


如果您想去除空白,请调用trim()。

我认为第二个字符串中没有空格这一事实只是偶然发生的,并不是问题的核心。在本例中,它将起作用,但在
“abc,\“def,ghi\”
上失败(我猜,这也是一个可能的有效输入)更好!现在我们的评论都不适用,因为这是一个完全不同的答案。我宁愿看到原来的答案被删除,而这是一个新的。但这只是细节+1为answer@DavidHedlund-是的,你可能是对的,但现在没关系了。@Burkhard的编辑实际上改变了预期结果的要求。你想要
{“abc”,“def,ghi”}
还是
{“abc”,“def,ghi\”}
?@David:实际上,我刚把abc改成了“abc”,也就是一个字符串。也许我也应该把“def,ghi”改成“def,ghi”?@Burkhard:是的,这正是我的观点。当第一个字符串没有被引用,而第二个字符串被引用时,我们仍然可以假设字符串引用一直被忽略,显示的只是值。现在我们不能真的假设任何东西=)我想要{“abc”,“\”def,ghi\”}System.out.println(strArray[1])的命令行中的结果应该是什么?这会处理嵌套的转义引号吗?这真的很好!对此,我可能会想出更复杂的方法:还没有,但是(1)我还没有看到这样的要求,(2)-这是一个基本算法。您可以很容易地添加“嵌套引号”检测并更改“isQuoted”测试。@Graphain:没有开始引号和结束引号,因此您永远无法分辨四个引号是两个带引号的字符串,还是一个带引号的字符串嵌套在另一个字符串中。世界不支持嵌套的转义引号,例如
,其中有不同的开始和停止符号。。。除非我误解了你的问题…?@David-one可以在所有嵌套引号中引入类似于
“one”、“two”、“three\\\”
的语法,但这不是一个要求(目前),它对String str=“abc,\”def,ghi\”,jkl”不起作用;预期输出为{abc,“def,ghi”,jkl}
List<String> res = new LinkedList<String>();

String[] chunks = str.split("\\\"");
if (chunks.length % 2 == 0) {
    // Mismatched escaped quotes!
}
for (int i = 0; i < chunks.length; i++) {
    if (i % 2 == 1) {
        res.addAll(Array.asList(chunks[i].split(",")));
    } else {
        res.add(chunks[i]);
    }
}