繁体   English   中英

Java String split 删除空值

[英]Java String split removed empty values

我正在尝试使用分隔符拆分值。 但我发现了令人惊讶的结果

String data = "5|6|7||8|9||";
String[] split = data.split("\\|");
System.out.println(split.length);

我期望得到 8 个值。 [5,6,7,EMPTY,8,9,EMPTY,EMPTY]但我只得到 6 个值。

任何想法以及如何解决。 无论 EMPTY 值出现在任何地方,它都应该在数组中。

split(delimiter)默认从结果数组中删除尾随的空字符串。 要关闭此机制,我们需要使用split(delimiter, limit)重载版本, split(delimiter, limit) limit设置为负值,例如

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

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

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

如果限制n大于零,则该模式将最多应用 n - 1 次,数组的长度将不大于 n,并且数组的最后一个条目将包含最后一个匹配的分隔符之外的所有输入。

如果n为非正数,则该模式将被应用尽可能多的次数,并且数组可以具有任意长度。

如果n为零,则该模式将被应用尽可能多的次数,数组可以具有任意长度,并且将丢弃尾随的空字符串

例外

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

String.split(String regex)的文档中:

此方法的工作方式就像通过使用给定表达式和零限制参数调用双参数 split 方法一样。 因此,结果数组中不包含尾随空字符串。

所以你将不得不使用两个参数版本String.split(String regex, int limit)和一个负值:

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

文件:

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

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

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

数据丢失时:

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

尽管缺少数据,但真正的要求是长度应为 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

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

来自String.split() API 文档

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

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

您可能有多个分隔符,包括空格字符、逗号、分号等。将它们放在可重复的组中 []+,例如:

 String[] tokens = "a , b,  ,c; ;d,      ".split( "[,; \t\n\r]+" );

你将有 4 个令牌——a、b、c、d

在应用此拆分之前,需要删除源字符串中的前导分隔符。

作为问题的答案:

String data = "5|6|7||8|9||";
String[] split = data.split("[\\| \t\n\r]+");

添加空格以防万一您将它们与 | 一起用作分隔符

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM