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