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

时间:2010-07-05 08:24:59

标签: java string

如何解析String str = "abc, \"def,ghi\"";

这样我得到的输出为

String[] strs = {"abc", "\"def,ghi\""}

即。一个长度为2的数组。

我应该使用正则表达式还是java api或任何其他开源中的任何方法

让我这样做的项目?

被修改

要提供有关问题的背景信息,我正在阅读一个文本文件,其中每行有一个记录列表。每条记录都有以分隔符(逗号或分号)分隔的字段列表。现在我有一个要求,我必须支持文本限定符一些excel或开放办公室支持。假设我有记录

abc,“def,ghi”

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

希望这能清除我的要求。

由于

谢加

4 个答案:

答案 0 :(得分:5)

基本算法并不太复杂:

 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;
}

答案 1 :(得分:2)

这个问题似乎合适:Split a string ignoring quoted sections

沿着那条线,http://opencsv.sourceforge.net/似乎是恰当的。

答案 2 :(得分:0)

试试这个 -

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

答案 3 :(得分:0)

尝试:

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]);
    }
}

这只会拆分不在转义引号之间的部分。

如果你想摆脱空白,请调用trim()。