逗号或行尾的Java string.split()

时间:2015-01-29 18:06:31

标签: java regex string delimiter stringtokenizer

我对正则表达式的东西很糟糕。我的数据看起来像这样:

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

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

new StringTokenizer(string, ",")

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

我可以让string.split( )表现得会继续分裂,直到遇到行尾,或者有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

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

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

limit参数在链接的Javadoc中解释:

  

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

答案 1 :(得分:0)

解析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();
}

输出(我添加了<>以显示值的开始和结束位置):

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