Java 字符串拆分不返回空结果

Java 字符串拆分不返回空结果,java,string,Java,String,我想用 "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 当我处

我想用

"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
当我处理这一行读取文本文件时,它会产生上面提到的错误结果,即在如下情况下,它不包含任何空结果:

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


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

老实说,我不认为拆分有什么好处。StringTokenizer也适用于大多数类似的情况,并且可以轻松地发回令牌(因此您可以看出其间没有任何东西:)

我只是希望它在增强的for循环中工作得更好一点,但除此之外,尝试一下也无妨


我认为有一个regexp技巧可以让匹配的代币返回,但我已经20年没有学习regexp了,它仍然不是我解决的任何问题的最佳答案(因为我从来没有使用过它,所以我实际上不知道,但非regexp解决方案通常太容易击败)我认为
StringTokenizer
可能更适合你,YMMV。

适合我

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"

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

在split语句中使用负数限制:

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

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

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

应该可以工作,但如果您仍然有问题,请尝试使用
StringTokenizer。

使用的类:

Iterable split=Splitter.on(':').split(“value1:value2::value3”);
Splitter
默认情况下不会忽略空结果,尽管您可以创建一个这样的结果。尽管从其他人的说法来看,你所做的也应该起作用。

这很有效

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

谢谢添加-1实际上解决了从文本文件读取时的特殊字符问题。它还包括空字符串。请不要使用StringTokenizer。Oracle建议使用
split
方法。这是StringTokenizer文档页面的一部分:
StringTokenizer是一个遗留类,出于兼容性原因而保留,尽管新代码中不鼓励使用它。建议任何寻求此功能的人改用String的split方法或java.util.regex包。
'value1',
'value2',
'',
'value3',
4
Iterable<String> split = Splitter.on(':').split("value1:value2::value3");
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