2014-02-13 56 views
2

我遇到了将字符串插入到String []数组的问题。我有以下字符串:Java:棘手的替换字符串

12343,"Den Haag, Willem de Zwijgerlaan",lol,"HI",ZF-32,"TZ,45,38" 

,或者例如这个字符串:

"Another String",44,33,"TZ,38",ok 

这仅仅是数以百万计的一个字符串我的应用是漓。问题是在这种情况下的分隔符是,字符。然而,它有时会被烧成一个领域。现在

,你可以看到"Den Haag, Willem de Zwijgerlaan"有性格,但是这是属于外地,而不是算作一个分隔符。

我想出了下面的代码,我坚持。

String before = "12343,\"Den Haag, Willem de Zwijgerlaan\",DH1,\"HI\",ZF-32,\"TZ,45,38\""; 
System.out.println(before); 

int first = before.indexOf("\""); 

if(first != -1) { 
    Boolean firstTime = true; 
    int firstPos = 0; 
    int secondPos = 0; 

    for (int i = -1; (i = before.indexOf("\"", i + 1)) != -1;) { 
     if(firstTime) { 
      firstPos = i; 
      firstTime = false; 
     } else { 
      secondPos = i; 
      System.out.println(before.substring(firstPos+1, secondPos)); 
      firstTime = true; 
     } 
    }   
} 

这导致:

12343,"Den Haag, Willem de Zwijgerlaan",lol,"HI",ZF-32,"TZ,45,38" 
Den Haag, Willem de Zwijgerlaan 
HI 
TZ,45,38 

我想一个String []数组看起来像这样:

String[] array = {"12343", "Den Haag, Willem de Zwijgerlaan", "lol", "HI", "ZF-32", "TZ,45,38"}; 
+0

也许你应该只是看的分隔符\ – Jeeter

+8

答案是一样的任何类似的问题:**不使用正则表达式对非正规字符串**。使用CSV解析器。这就是他们的目的。 –

+1

或安排将数据作为JSON发送。 –

回答

2

你不能在这里使用正则表达式;你有一个非常规的字符串。您可以使用CSV(逗号分隔值)解析器,该解析器应将字符串拆分为其组成部分。一种选择是使用Commons CSV

另一种选择是根据语法手动解析字符串了:

<line>    ::= <element> {',' <element> } 
<element>   ::= '"' <contents> '"' 
<contents>   ::= { <character> | <escaped-character> } 
<character>   ::= * //any old character 
<escaped-character> ::= '\' <character> 

但实际上,它会更容易使用CSV解析器。

+0

我会看看 –

+0

你说这是不是正规的语言,我不敢苟同。例如,正则表达式'“([^”] | \\“)*” | [^!。 ,] +'可能会这样做,尽管目前还不清楚解析规则究竟是什么,当然,我并不建议这样做。 –

+2

使用opencsv结束了! –