字符串拆分不返回空结果

时间:2010-09-21 21:36:12

标签: java string

我正在尝试使用

"value1:value2::value3".split(":");

问题是我希望它包含空白结果。

返回:[value1, value2, value3]
它应该是:[value1, value2, , value3]

有没有人知道正则表达式来解决这个问题?

好的,我找到了问题原因。我实际上正在阅读一个文本文件,它包含这一行:

123:;~\&:ST02:M:test:M:4540145::type;12:51253:D:2.2:567766::AL:::::::2.2b

当我处理这一行读取文本文件时,它会产生上面提到的错误结果,在这种情况下它不包括任何空结果::::::。

但是当我在测试程序中使用上面的行时,它没有编译,我得到一个“无效的转义序列”。我认为这是因为“\&”。

使用正则表达式是否有解决此问题的方法?

9 个答案:

答案 0 :(得分:19)

split在结果中包含空匹配,请查看docs here。但是,默认情况下,将丢弃尾随空字符串(数组末尾的字符串)。如果您还想包含这些内容,请尝试split(":", -1)

答案 1 :(得分:4)

适合我。

class t {
    public static void main(String[] _) {
        String t1 = "value1:value2::value3";
        String[] t2 = t1.split(":");
        System.out.println("t2 has "+t2.length+" elements");
        for (String tt : t2) System.out.println("\""+tt+"\"");
    }
}

给出输出

$ java t
t2 has 4 elements
"value1"
"value2"
""
"value3"

答案 2 :(得分:2)

我认为StringTokenizer可能对你更有效,YMMV。

答案 3 :(得分:1)

我真的没有看到分裂的大抽奖。 StringTokenizer对于像这样的大多数事情都可以正常工作,并且可以轻松地发送回令牌(所以你可以告诉它们之间没有任何内容::)。

我只是希望它对增强的for循环有所改善,但除此之外,尝试一下也不会有什么坏处。

我认为有一个正则表达式的技巧可以让你的匹配代币返回,但是我已经走了20年而没有学习正则表达式而且它仍然不是我解决的任何问题的最佳答案(不是我实际上知道,因为我从来没有使用它,但非正则表达式解决方案通常太容易被击败。)

答案 4 :(得分:1)

在拆分声明中使用否定限制:

String str = "val1:val2::val3";
String[] st = str.split(":", -1);
for (int i = 0; i< st.length; i++)
    System.out.println(st[i]);

结果:

val1
val2

val3

答案 5 :(得分:1)

public static void main(String[] args){
  String[] arr = "value1:value2::value3".split(":");
  for(String elm:arr){
    System.out.println("'"+elm+"',");
  }
  System.out.println(arr.length);
}

打印

'value1',
'value2',
'',
'value3',
4

这正是你想要的。你的错误在其他地方......

答案 6 :(得分:1)

使用GuavaSplitter课程:

Iterable<String> split = Splitter.on(':').split("value1:value2::value3");

Splitter默认情况下不会省略空结果,但您可以创建一个。虽然看起来其他人说的是你正在做的事也应该有效。

答案 7 :(得分:0)

这应该有用,但如果你还有问题,请给StringTokenizer一个。

答案 8 :(得分:0)

这有效,

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.File;
import java.io.IOException;

public class split {
public static void main(String[] args)
{
    String data = null;
    try {
    BufferedReader br = new BufferedReader(new FileReader(new File("split.csv")));
    while( (data=br.readLine())!=null)
    {
        System.out.println("line:"+data);
        String[] cols = data.split(":",-1);
        System.out.println("count:"+cols.length);
        for(int x=0;x<cols.length;++x)
        {
            System.out.println("["+x+"] =("+cols[x]+")");
        }
    }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

这是一个测试文件,

a:b:c:d:e
a:b:c:d:
a:b:c::
a:b::: 
a::::
::::
::::e
:::d:e
::c:d:e
:b:c:d:e
a:b:c:d:e