2010-07-05 44 views
3

如何解析String str = "abc, \"def,ghi\"";如何解析具有文本限定符的字符串

使得我得到的输出作为

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

即长度的数组2.

我应该使用正则表达式或是否有在Java API的任何方法或任何其它开源

项目这让我这样做?

主编

为了让情境这个问题,我读它具有记录每行一个列表的文本文件。每个记录都有由分隔符(逗号或分号)分隔的字段列表。现在我有一个要求,我必须支持文本限定符某些事情Excel或开放式办公室支持。假设我有记录

ABC,“DEF,GHI”

在此,是我的分隔符,“是我的文本识别符,这样当我分析这个字符串,我应该得到两个领域ABC和DEF,GHI不{ ABC,DEF,GHI}

希望这将清除我的要求

感谢

谢卡尔

+1

@Burkhard的编辑实际上改变了预期结果的要求。你想要'{“abc”,“def,ghi”}或者'{“abc”,“\”def,ghi \“”}'? – 2010-07-05 08:32:22

+0

@David:实际上,我只是将abc更改为“abc”,即一个String。也许我也应该把“def,ghi”改成“\”def,ghi \“”? – Burkhard 2010-07-05 08:36:21

+1

@Burkhard:是的,那正是我的观点。当第一个字符串没有被引用并且第二个字符串是,我们仍然可以假设字符串引用一直被忽略,并且所有显示的都是*值*。现在我们不能假设任何东西=) – 2010-07-05 08:38:24

回答

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

会处理嵌套的转义引号吗? – 2010-07-05 08:41:40

+1

真的很整洁!我可能会想出一些更复杂的方式:D – 2010-07-05 08:42:37

+1

还没有,但(1)我没有看到这样的要求,(2) - 这是一个基本的算法。您可以轻松添加“嵌套报价”检测并更改“isQuoted”测试。 – 2010-07-05 08:44:35

2

这个问题似乎是恰当的:Split a string ignoring quoted sections

沿着那条线,http://opencsv.sourceforge.net/看起来很合适。

+2

我认为第二个字符串没有空格的事实只是附带的,并不是真正的核心问题 – 2010-07-05 08:28:34

+0

将使用这个例子,但在''abc,\“def,ghi \”“'上失败(只是我的猜测,这也是一个可能的有效输入) – 2010-07-05 08:29:00

+0

@大卫是正确的对不起空间有错误..所以我不能依靠空间.. – Shekhar 2010-07-05 08:29:17

0

试试这个 -

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

对于字符串str =“abc,\”def,ghi \“,jkl”; 预期的输出将是{abc, “DEF,GHI”,JKL} – Shekhar 2010-07-05 09:04:46

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()。