Java 分割字符串,保留所有尾随的空元素

Java 分割字符串,保留所有尾随的空元素,java,regex,Java,Regex,我对java编程比较陌生。如何拆分以下由分号分隔的字符串行 String; String; String; String, String; String;;String; String; String; String; ;String;String;String;String 我想将每个字符串作为参数传递给构造函数(从txt文件),但我无法找到可通过的正则表达式。构造函数有8个字符串参数(在两个分号之间没有任何值;;,我希望得到一个空字符串)。在这种情况下,将创建两个单独的对象。我知道拆分字符

我对java编程比较陌生。如何拆分以下由分号分隔的字符串行

String; String; String; String, String; String;;String;
String; String; String; ;String;String;String;String
我想将每个字符串作为参数传递给构造函数(从txt文件),但我无法找到可通过的正则表达式。构造函数有8个字符串参数(在两个分号之间没有任何值;;,我希望得到一个空字符串)。在这种情况下,将创建两个单独的对象。我知道拆分字符串通常是如何工作的,但是这个对我来说似乎太棘手了。

你的答案在后面


由于您声明要包含空格,因此仅在
上拆分
并希望为构造函数保留8个参数,我们将使用带limit方法的split

示例:

String in = "String; String; String; String, String; String;;String;";
String[] s1 = in.split(";");
给出:

["String"," String"," String, String"," String"," String","","String"]
只有长度为7且将失败的构造函数


给出:

["String"," String"," String"," String, String"," String","","String",""]`
长度为8且有效


然后,您可以使用以下方法对构造函数进行寻址:

YourObject obj = new YourObject(s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7]);
问题在于没有保留尾随的空元素:

因此,结果数组中不包括尾随的空字符串

要包含它们,请使用
-1
作为第二个参数(请参阅):

见此:

公共字符串[]拆分(字符串正则表达式,整数限制)

limit参数控制应用阵列的次数,因此会影响结果阵列的长度如果
n
为非正,则图案将被应用尽可能多的次数,并且阵列可以有任何长度
。如果
n
为零,则将尽可能多次应用该模式,数组可以有任何长度,并且将丢弃尾随的空字符串


使用以分号作为分隔符的字符串拆分方法为什么看起来很棘手?你想实现什么?你被困在哪里?此外,第一行(
String,String
)中还有一个逗号。我尝试了(“;”)、(“\\W”)和(\\;)正则表达式,但我总是得到java.lang.ArrayIndexOutOfBoundsException。@Stribizev请再次阅读问题“构造函数有8个字符串参数(两个分号之间没有任何值;;,我想得到一个空字符串)”在OP提供的第一种情况下,代码不会返回最后一个参数,
tokens.length==7
case@ferrybig:那不是我的,那是阿诺迪的回答。是,省略最后一个空元素。我把我的答案贴在我描述如何避免省略尾随的空元素的地方和一个随机的
。这是行不通的。在没有任何参数的情况下使用split与使用“0”标记的限制调用它是一样的,根据Javadoc,这将确实返回空匹配项。仍然存在随机的
。根据OP所说,它不是分隔符,因此参数包含逗号可能非常有效。是的,该参数包含一个逗号。
["String"," String"," String"," String, String"," String","","String",""]`
YourObject obj = new YourObject(s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7]);
String s  = "String; String; String; String, String; String;;String;";
System.out.println(Arrays.toString(s.split(";", -1)));