2010-09-21 87 views
8

我试图使用字符串分割不返回空的结果

"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 

当我处理这条线读取它产生上述错误结果的文本文件,这是不包括在任何情况下,空的结果喜欢这个: :::::。

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

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

回答

18

split不包括在结果空场比赛,看看在docs here。但是,默认情况下,尾随空字符串(数组末尾的那些)将被丢弃。如果您还想包括这些,请尝试split(":", -1)

+0

谢谢......添加-1实际解决了从文本文件读取时出现的特殊字符问题。它还包括空字符串。 – Marquinio 2010-09-23 16:24:47

+1

文档链接不起作用。 – 2015-01-30 21:50:40

1

我不诚实地看到分裂的大抽奖。 StringTokenizer对于这样的大多数事情也同样适用,并且可以轻松地发回令牌(所以你可以知道::之间没有任何内容)。

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

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

2

我认为StringTokenizer可能对您更好,YMMV。

+0

不要使用的StringTokenizer请。 Oracle建议使用split方法。这是StringTokenizer文档的一部分页面: 'StringTokenizer是一个遗留类,由于兼容性原因而被保留,尽管在新代码中不鼓励使用它。建议任何寻求此功能的人都使用String或java.util.regex包的拆分方法。 – 2015-01-30 21:52:51

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

这是你想要什么。你的错误在别的地方...

0

这应该工作,但如果您仍然有问题,请给StringTokenizer

1

使用GuavaSplitter类:

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

Splitter默认情况下不忽略空的结果,但你可以做一个没有。尽管从其他人的看法来看,你所做的事情也应该如此。

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