Java String拆分删除了空值

Red*_*ddy 262 java string split

我试图使用分隔符拆分值.但我发现了令人惊讶的结果

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值在任何地方出现,它都应该在数组中.

jlo*_*rdo 450

split(delimiter)默认情况下,从结果数组中删除尾随空字符串.要打开这个机制关闭我们需要使用重载的版本split(delimiter, limit)limit一套像负值

String[] split = data.split("\\|", -1);
Run Code Online (Sandbox Code Playgroud)

更多细节:
split(regex)内部返回您可以找到的此方法的结果split(regex, 0)文档(强调我的)

limit参数控制应用模式的次数,因此会影响结果数组的长度.

如果限制n大于零,则该模式将最多n应用- 1次,数组的长度将不会大于n,并且数组的最后项将包含超出最后匹配的定界符的所有输入.

如果n的非正则模式将被应用多次可能的,并且阵列可以具有任意长度.

如果n,则图案将被应用的次数成为可能,该阵列可具有任何长度,并且拖尾空字符串将被丢弃.

例外:

值得一提的是,只有当这样的空字符串由split机制创建时,删除尾随空字符串才有意义.因此,对于"".split(anything)因为我们不能分割""得更远,我们将得到的结果[""]阵列.
它发生的原因是这里没有发生拆分,所以""尽管是空的并且尾随代表原始字符串,而不是由分割过程创建的空字符串.

  • **不要使用`split("\\ |",8)`因为这限制了前八个令牌!**如果你的字符串是可变的,你应该使用`split("\\ |",-1) `这样它就可以创建无限数量的令牌,并且**不会在最后丢弃空令牌. (21认同)
  • 显然,很多人都希望保留尾随的空字符串是`split(regex)`的默认功能.他们最终到了这里,发现事实并非如此. (7认同)
  • 哇.这工作非常出色.但-1如何改变一切? (2认同)
  • @Reddy -1(实际上是_或任何负数,无论is_的绝对值如何都没有)告诉split方法将空标记保留在最后。默认值为0,它告诉方法在数组末尾丢弃空令牌。 (2认同)

ppe*_*rka 31

来自以下文件String.split(String regex):

此方法的工作方式就像调用带有给定表达式和limit参数为零的双参数split方法一样.因此,结尾的空字符串不包含在结果数组中.

因此,您必须使用String.split(String regex, int limit)带负值的两个参数版本:

String[] split = data.split("\\|",-1);
Run Code Online (Sandbox Code Playgroud)

文档:

如果限制n大于零,那么模式将最多应用n - 1次,数组的长度将不大于n,并且数组的最后一个条目将包含超出最后匹配分隔符的所有输入.如果n是非正数,那么模式将被应用尽可能多的次数,并且数组可以具有任何长度.如果n为零,那么模式将被应用尽可能多的次数,数组可以具有任何长度,并且将丢弃尾随的空字符串.

这不会遗漏任何空元素,包括尾随元素.


小智 7

String[] split = data.split("\\|",-1);

这并不是一直以来的实际要求。上面的缺点如下所示:

Scenerio 1:
When all data are present:
    String data = "5|6|7||8|9|10|";
    String[] split = data.split("\\|");
    String[] splt = data.split("\\|",-1);
    System.out.println(split.length); //output: 7
    System.out.println(splt.length); //output: 8
Run Code Online (Sandbox Code Playgroud)

数据丢失时:

Scenerio 2: Data Missing
    String data = "5|6|7||8|||";
    String[] split = data.split("\\|");
    String[] splt = data.split("\\|",-1);
    System.out.println(split.length); //output: 5
    System.out.println(splt.length); //output: 8
Run Code Online (Sandbox Code Playgroud)

尽管缺少数据,但真正的要求是长度应为 7。因为在某些情况下,例如我需要插入数据库或其他内容。我们可以通过使用以下方法来实现这一点。

    String data = "5|6|7||8|||";
    String[] split = data.split("\\|");
    String[] splt = data.replaceAll("\\|$","").split("\\|",-1);
    System.out.println(split.length); //output: 5
    System.out.println(splt.length); //output:7
Run Code Online (Sandbox Code Playgroud)

我在这里所做的是,我正在删除“|” 管道结束,然后拆分字符串。如果您有“,”作为分隔符,那么您需要在replaceAll中添加“,$”。


Per*_*ror 5

来自String.split() API 文档

围绕给定正则表达式的匹配拆分此字符串。此方法的工作方式类似于使用给定的表达式和零限制参数调用双参数拆分方法。因此,结果数组中不包含尾随空字符串。

重载String.split(regex, int)更适合您的情况。