字符串类拆分功能正在返回歧义结果

时间:2018-08-14 06:25:44

标签: java regex

下面是2个代码

System.out.println(",,,,,".split(",").length);

System.out.println(",,,,, ".split(",").length);

对于第一个代码,其打印结果为 0 ,对于第二个代码,其打印结果为6。

我的问题是为什么当我没有在末尾添加额外的空间时拆分无法识别“,” ,但是当我在末尾添加额外的空间时却能够识别拆分。

请注意,我已经使用正则表达式“ \\ s *,\\ s” 进行了尝试,但结果相同。

4 个答案:

答案 0 :(得分:2)

我没有文档参考,但是凭经验,我在测试String#split时看到的是,如果没有实际的文本匹配,则数组中也不会返回零宽度的匹配。因此,以下代码返回一个空数组:

",,,,,".split(",")

但是,如果您在一系列逗号的末尾添加一个空格,然后进行相同的拆分,则只有一个匹配的空格。结果,该数组将返回所有匹配项,包括零宽度匹配项:

",,,,, ".split(",")

但是,因为逗号之间没有内容,所以我将您的实际要求解释为希望将每个逗号分成一个单独的结果。如果是这样,则可以使用环顾四周进行拆分,如下所示:

String input = ",,,,,";
String[] parts = input.split("(?<=,)(?=,)");
for (String part : parts) {
    System.out.println(part);
}

这将输出:

,
,
,
,
,

Demo

答案 1 :(得分:1)

Java中的

<html> <body> <div class="field-group"> <div class="field"> <textarea rows="20" cols="70" class="relative" id="myTextarea"> Welcome!! </textarea> </div> </div> 默认情况下从结果数组中删除结尾的空字符串。要保持空白,您可以将split()设置为负值,而使用split(delimiter, limit)

limit

答案 2 :(得分:0)

让我们探索更多,看看以下拆分的有趣结果:

System.out.println(",,,,,,".split(",").length); // 0
System.out.println(",,,,,, ".split(",").length); // 7
System.out.println(",,, ,,,".split(",").length); // 4
System.out.println(" ,,,,,,".split(",").length); // 1

想知道这是为什么发生的原因是因为以下声明为docs中的split方法声明了

  

因此,空字符串不包含在结果中   数组。

文档:https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String)

如果您不希望使用split方法删除该空格,则应使用另一个带有限制的split:

public String[] split(String regex,int limit)

文档:https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String,%20int)

示例:

System.out.println(",,,,,,".split(",",-1).length); // 7
System.out.println(",,,,,, ".split(",",-1).length); // 7
System.out.println(",,, ,,,".split(",",-1).length); // 7
System.out.println(" ,,,,,,".split(",",-1).length); // 7

答案 3 :(得分:0)

忘记文档,我直接查看了代码,并在java.lang.String#split(java.lang.String, int)中找到了以下代码:-

while (resultSize > 0 && list.get(resultSize - 1).length() == 0) {
    resultSize--;
}

这证明它旨在删除最后一个元素(如果为空)。并继续执行直到最后一个元素的长度不为零为止。

此功能很有用,例如,如果您有字符串a,b,,则应在结果数组中返回ab,而不是最后一个空白字符''在最后一个逗号之后。

如果您执行System.out.println(", ,,,".split(",").length);,它将返回2,因为上述while循环将不断从右侧减少结果,直到找到长度不为零的东西为止。

上面的while循环包含在if (limit == 0)中。因此,如果要全部计算,请使用非零限制。如果您不希望有任何限制,请使用负数,例如-1。