当字符串是所有换行符时,Java按换行符分割

时间:2014-02-24 02:22:35

标签: java regex

当我有一个像\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);
     }
}

你可以复制&将代码粘贴到CompileOnline

3 个答案:

答案 0 :(得分:5)

您拆分的令牌不是结果的一部分。由于没有其他内容,因此没有项目可以放入数组中。

但是,当您向基本字符串添加另一个字符时,这会有所不同。当你这样做时,它将包括空条目。

这可以通过查看java.lang.String:2305中的源代码来解释。

请考虑以下摘录:

// Construct result
int resultSize = list.size();
if (limit == 0)
     while (resultSize > 0 && list.get(resultSize - 1).length() == 0)
           resultSize--;
String[] result = new String[resultSize];
return list.subList(0, resultSize).toArray(result);

如果你的情况有3个空条目,resultSize将倒数到0并基本上返回一个空数组。

如果你有3个空条目和一个填充的条目(你添加到结尾的随机字符),resultSize将不会从4移动,因此你将得到4个项目的数组,其中前3个是空。

基本上它会删除所有尾随的空值。

String str = "\n\n\n";      // Returns length 0
String str = "\n\n\nb";     // Returns length 4
String str = "\n\n\nb\n\n"; // Returns length 4

答案 1 :(得分:4)

String javadoc中所述:

  

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

因此,当split() String完全由分隔符(无论分隔符是什么)构成时,您将只获得空String个,分隔符未包含在结果中,因此,它们都将被视为尾随空字符串,并且不包括在结果数组中。

如果你想获得所有东西,包括空字符串,你有两个选择:

  • String的末尾添加不是分隔符的内容:

    String str = "\n\n\ne";
    String[] lines = str.split("\\n");
    System.out.println(lines.length); // prints "4"
    
  • 使用two-argument split method使用否定limit

    String str = "\n\n\n";
    String[] lines = str.split("\\n", -1);
    System.out.println(lines.length); // prints "4"
    

答案 2 :(得分:0)

因为你的字符串只包含\ n

str.split(“”\ n“)获取\ n之后的字符串,它在下一次拆分搜索之前等于NULL。因此,当[[]行存储NULL时,你得到0。