我试图使用分隔符拆分值.但我发现了令人惊讶的结果
String data = "5|6|7||8|9||";
String[] split = data.split("\\|");
System.out.println(split.length);
Run Code Online (Sandbox Code Playgroud)
我期待得到8个值.[5,6,7,EMPTY,8,9,EMPTY,EMPTY] 但我只得到6个值.
任何想法和如何解决.无论EMPTY值在任何地方出现,它都应该在数组中.
在Java中,我使用String split方法拆分包含以分号分隔的值的字符串.
目前,我有以下一行在99%的情况下都有效.
String[] fields = optionsTxt.split(";");
Run Code Online (Sandbox Code Playgroud)
使用以下String时,一切都很完美:
"House;Car;Street;Place" => [House] [Car] [Street] [Place]
Run Code Online (Sandbox Code Playgroud)
但是当我使用下面的String时,split方法忽略最后两个分号.
"House;Car;;" => [House][Car]
Run Code Online (Sandbox Code Playgroud)
怎么了?或者有任何解决方法吗?
String类的split方法不包括它返回的数组中的尾随空字符串.我如何克服这个限制:
class TestRegex{
public static void main(String...args){
String s = "a:b:c:";
String [] pieces = s.split(":");
System.out.println(pieces.length); // prints 3...I want 4.
}
}
Run Code Online (Sandbox Code Playgroud) 我想通过分隔符"|"拆分String 在Java中获取String数组,这是我的代码:
String str = "123|sdf||";
String[] array = str.split("\\|");
Run Code Online (Sandbox Code Playgroud)
我将得到2个元素的数组:"123","sdf"
.我期望阵列有4个元素:"123","sdf","",""
; 我可以用任何现有的课程吗?我也试过StringTokernizer,不起作用
答案,请看下面 - 士气:从不.split()
单独打电话; 如果你想要理智的行为,总是给它一个-1的长度参数.但不是0!
在对javadoc的Pattern.split()
状态如下:
此方法返回的数组包含输入序列的每个子字符串,该子字符串由与此模式匹配的另一个子序列终止,或者由输入序列的末尾终止.
见证这段代码:
private static final Pattern UNDERSCORE = Pattern.compile("_");
public static void main(final String... args)
{
System.out.println(UNDERSCORE.split("_").length);
}
Run Code Online (Sandbox Code Playgroud)
现在,引用javadoc,数组应该包含输入的子字符串(引用):
UNDERSCORE
显然匹配);然而,上面的代码打印出来0
.为什么?这是一个已知的错误?(imnsho是的,见下文)还有哪些.split()
不遵守合同的情况?(再见下文)
答案(右下方的解释性文字)
使用a时Pattern
,单参数.split()
方法相当于使用参数调用双参数方法0
.
这就是错误所在.如果参数为0,则从结果中删除从数组末尾"向下"到第一个非空元素的所有空字符串.
如果在阅读本文之前,你不知道脑死亡设计的决定是什么,现在你知道了.这是默认行为更加危险.
解决方案是始终使用方法的完整形式.split()
并给它一个负长度参数.这里,选择-1.在这种情况下,.split()
表现得很明智:
private static final Pattern UNDERSCORE = Pattern.compile("_");
public static void main(final String... args)
{
System.out.println(UNDERSCORE.split("_").length);
System.out.println(UNDERSCORE.split("__").length);
System.out.println(UNDERSCORE.split("_x_").length); …
Run Code Online (Sandbox Code Playgroud) 当我有一个类似的字符串\n\n\n
,然后我分手时\\n
,我明白了0
.为什么是这样?
public class Test {
public static void main(String []args){
String str = "\n\n\n";
String[] lines = str.split("\\n");
System.out.println(lines.length);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以将代码复制并粘贴到CompileOnline中.
我有一个String
,我想把它拆分为","
如果假设我有一个字符串,
String test = "aa,bb,cc";
Run Code Online (Sandbox Code Playgroud)
现在我可以分开了,
String[] spl = test.split(",");
Run Code Online (Sandbox Code Playgroud)
而spl.length是3
如果假设我的字符串是
String test = ",,,";
Run Code Online (Sandbox Code Playgroud)
这里分割的String 长度为0.但我的预期答案是3.我的测试String
是dynamaic值,它可能会有所不同,现在想我有一个类似的字符串
String test = ",aa,dd,,,,,ff,gg"
现在,分裂的数组长度为4.但我预期的答案是9 而我需要通过拆分""和我需要的氨基酸在位置SPL [1]和DD位置SPL [2]和FF位置SPL [7]
有人可以提出解决这个问题的建议吗?
我的字符串(str)是
",2016-06-29,SNET Closed End Municipal Bond Fund,CEFMX,,,,1272.772883,1063620.586,835.6719414,77,,0,,,,"
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我String arr[] = str.split(",");
得到的是长度为13而不是17.分裂后不考虑0之后的逗号.
我在这里错过了什么?
如果我运行以下代码:
"testx".split("x")
Run Code Online (Sandbox Code Playgroud)
期望我们会得到{"test", ""}
,但 java 正在返回{"test"}
但"xtest".split("x")
返回{"", "test"}
。任何想法为什么它的行为很奇怪(或)我有错误的理解吗?
这是我的 JDK 和系统信息:
JRE:1.8.0_152-release-1024-b6 amd64
JVM:JetBrains sro 的 OpenJDK 64 位服务器 VM
Linux 4.4.0-34-generic