Java字符串使用逗号或行尾进行分割(string.split())

3

我很不擅长正则表达式相关的内容。我有一些数据看起来像这样:

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

数据本身的含义有些不相关,重点是它用逗号分隔,你可以把逗号之间的数据称为“列”,有些列可能是空格或空的(后面,空格列和空列将被忽略)。我需要根据逗号分隔符将字符串拆分为数组。我尝试过:
new StringTokenizer(string, ",")

但是使用此方法会跳过列之间数据为空的标记,所以我尝试使用string.split(",")。但问题在于它将跳过上述数据中的最后三列。可以说在“334”之后,它的行为类似于StringTokenizer,跳过其中没有空格或没有数据的列。
我能否使string.split()继续分割,直到遇到行尾,或者有更好的方法吗?

当到达行尾时,你想要做什么?如果值中有逗号,该如何转义处理? - fge
@fge,本质上,我想要按逗号或行尾进行拆分。列中永远不会有逗号。换句话说,数据中实际值部分永远不会包含逗号。我们可以假设这一点。 - rshaq
2个回答

4
你可以使用重载的String#split(String,int)方法,并将限制设置为负数:
String text = "abc,42,4/04/1992,,,something, ,2/05/2007,dkwit,,334,,,";
String[] tokens = text.split(",", -1);

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

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


1
最简单的解析CSV(逗号分隔值)数据的方法是使用CSV解析器。其中最简单的之一是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>   <>  <>  <>  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接