Java 为什么字符串分割(…)是这样实现的?

Java 为什么字符串分割(…)是这样实现的?,java,arrays,string,split,javadoc,Java,Arrays,String,Split,Javadoc,实际上,我正在开发一个软件,该软件需要读取文本文件,其中有些功能在这里将不作解释。在测试代码时,我发现了一个异常,它似乎来自str.split(“\r\n”)的实现,其中str是文件内容的子字符串 当我的子字符串以连续的“\r\n”(几个换行符)结束时,该方法完全忽略这一部分。例如,如果我使用以下字符串: "\r\nLine 1\r\n\r\nLine 2\r\n\r\n" ,我想得到以下数组 ["", "Line 1", "", "Line 2", "", ""] ,但它返回: ["",

实际上,我正在开发一个软件,该软件需要读取文本文件,其中有些功能在这里将不作解释。在测试代码时,我发现了一个异常,它似乎来自
str.split(“\r\n”)
的实现,其中
str
是文件内容的子字符串

当我的子字符串以连续的
“\r\n”
(几个换行符)结束时,该方法完全忽略这一部分。例如,如果我使用以下字符串:

"\r\nLine 1\r\n\r\nLine 2\r\n\r\n"
,我想得到以下数组

["", "Line 1", "", "Line 2", "", ""]
,但它返回:

["", "Line 1", "", "Line 2"]
String.split()

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


我无法理解这种不对称性;为什么他们忽略了结尾的空字符串,而不是开头的空字符串?

Javadocs解释了为什么它会这样工作;您必须询问他们为什么选择此默认实现。为什么不按照文档的要求调用split(regex,n)?使用-1做你想做的事情,就像文档暗示的那样

class Main {
  public static void main(String[] args) {
    String   s = "\r\nLine 1\r\n\r\nLine 2\r\n\r\n";
    String[] r = s.split("\\r\\n", -1);

    for (int i = 0; i < r.length; i++) {
      System.out.println("i: " + i + " = \"" + r[i] + "\"");
    }
  }
}

Javadocs解释了为什么它是这样工作的;您必须询问他们为什么选择此默认实现。为什么不按照文档的要求调用split(regex,n)?使用-1做你想做的事情,就像文档暗示的那样

class Main {
  public static void main(String[] args) {
    String   s = "\r\nLine 1\r\n\r\nLine 2\r\n\r\n";
    String[] r = s.split("\\r\\n", -1);

    for (int i = 0; i < r.length; i++) {
      System.out.println("i: " + i + " = \"" + r[i] + "\"");
    }
  }
}

您错过了解释“因此”的部分,该部分指出:

此方法的工作原理类似于使用给定表达式和零限制参数调用双参数
split
方法

查看引用的两个arg显示

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

所以这不是你想要的特殊情况。改为使用负整数调用:

str.split("\r\n", -1)

不清楚作者为什么认为0比-1更受欢迎,但这并不重要,因为您想要的选项已经存在。

您错过了解释的部分,因此,它指出:

此方法的工作原理类似于使用给定表达式和零限制参数调用双参数
split
方法

查看引用的两个arg显示

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

所以这不是你想要的特殊情况。改为使用负整数调用:

str.split("\r\n", -1)

不清楚作者为什么认为0比-1更受欢迎,但这并不重要,因为您想要的选项已经存在。

这是否回答了您的问题?您甚至可以在关闭后选择答案。我不认为你可以成为复制链的一部分,除非你这样做:)这能回答你的问题吗?您甚至可以在关闭后选择答案。我不认为你可以成为重复链的一部分,除非你这样做:)谢谢你指出另一个方法:)尽管如此,我不明白他们为什么选择默认删除尾随空格而不是前导空格。例如,如果你在解析CSV,前导空格可能更重要。我不明白的是,为什么他们默认情况下没有保留尾随空格。感谢您指出另一种方法:)尽管如此,我不明白他们为什么选择默认删除尾随空格而不是前导空格。例如,如果您正在解析CSV,前导空格可能更重要。我不明白的是为什么他们没有默认保留后面的那个。