【问题标题】:Java string.split( ) on comma or end-of-line [duplicate]逗号或行尾的 Java string.split() [重复]
【发布时间】:2015-03-29 02:01:11
【问题描述】:

我对正则表达式的东西很糟糕。我的数据如下所示:

abc,42,4/04/1992,,,something,   ,2/05/2007,dkwit,,334,,,

数据本身的含义有点无关紧要,关键是它是逗号分隔的,你可以将逗号之间的数据称为“列”,并且某些列可能是空格或空的(稍后,空格列和空列被忽略)。我需要根据逗号分隔符将字符串拆分为数组。我试过了

new StringTokenizer(string, ",")

但这会跳过列之间数据为空的标记,所以我尝试使用string.split(",")。这样做的问题是它会跳过上面数据中的最后三列。您可以说在“334”之后,它的行为类似于 StringTokenizer,跳过其中没有空格或没有数据的列。

我可以让string.split( ) 的行为方式使其继续拆分直到遇到行尾,还是有更好的方法来做到这一点?

【问题讨论】:

  • 当到达行尾时你想做什么?值中有什么逗号?它是怎么逃出来的?
  • @fge 本质上,我想在逗号或行尾分割。列内永远不会有逗号。换句话说,数据永远不会包含逗号作为实际值的一部分。我们可以假设这一点。

标签: java regex string delimiter stringtokenizer


【解决方案1】:

解析 CSV(逗号分隔值)数据的最简单方法是使用 CVS 解析器。最简单的一种是OpenCVS。以下是如何做到这一点的示例:

String data = "abc,42,4/04/1992,,,something,   ,2/05/2007,dkwit,,334,,,";

CSVReader reader = new CSVReader(new StringReader(data));
for (String[] tokens = reader.readNext(); tokens != null; tokens = reader.readNext()) {
    for (String token : tokens){
        System.out.print("<" + token + ">\t");
    }
    System.out.println();
}

输出(我添加了&lt;&gt; 以显示值的开始和结束位置):

<abc>   <42>    <4/04/1992> <>  <>  <something> <   >   <2/05/2007> <dkwit> <>  <334>   <>  <>  <>  

【讨论】:

    【解决方案2】:

    您可以使用重载的String#split(String,int) 方法,并将限制设置为负数:

    String text = "abc,42,4/04/1992,,,something, ,2/05/2007,dkwit,,334,,,";
    String[] tokens = text.split(",", -1);
    

    限制参数在链接的Javadoc中解释:

    limit 参数控制应用模式的次数,因此会影响结果数组的长度。如果限制 n 大于零,则该模式将最多应用 n - 1 次,数组的长度将不大于 n,并且数组的最后一个条目将包含最后一个匹配分隔符之外的所有输入。 如果 n 为非正数,则该模式将被应用尽可能多的次数,并且数组可以有任意长度。如果 n 为零,则该模式将被应用尽可能多的次数,数组可以有任意长度,并且尾随的空字符串将被丢弃。

    【讨论】:

      猜你喜欢
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多