【问题标题】:Java: tricky replace String [duplicate]Java:棘手的替换字符串[重复]
【发布时间】:2014-02-13 21:45:17
【问题描述】:

我在将字符串插入 String[] 数组时遇到问题。我有以下字符串:

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

【问题讨论】:

  • 也许你应该只寻找分隔符 \
  • 答案与任何类似问题的答案相同:不要对非常规字符串使用正则表达式。使用 CSV 解析器。这就是他们的目的。
  • 或者安排数据以 JSON 格式发送。
  • @HotLicks 不幸的是,这超出了我的能力范围 :(
  • @HovercraftFullOfEels 谢谢!你回答了我的问题,现在使用 opencsv,它做得很好!我没有意识到这是一个 CSV 转储,总是在学习新事物

标签: java string


【解决方案1】:

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

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

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

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

【讨论】:

  • 你说这不是常规语言。我不敢苟同。例如,正则表达式"([^"]|\\")*"|[^,]+ 可能会这样做,尽管尚不清楚解析规则到底是什么。当然,我不会建议这样做。
  • 最终使用了 opencsv!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
相关资源
最近更新 更多