字符串拆分不返回空结果

我正在尝试使用

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

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

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

有谁知道regexp来解决这个问题?

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

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

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

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

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

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

适合我。

 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" 

我认为一个StringTokenizer可能对你更好,YMMV。

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

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

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

在split语句中使用负限制:

 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 
 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 

这正是你想要的。 你的错误在别的地方……

使用Guava的Splitter类:

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

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

如果你还有问题,那应该可以使用StringTokenizer

这有效,

 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 

这是一个测试文件,

 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