Java 为什么\r\n";。split(";\r\n";)是否返回空数组?

Java 为什么\r\n";。split(";\r\n";)是否返回空数组?,java,regex,string,newline,text-processing,Java,Regex,String,Newline,Text Processing,我有一个正则表达式“[\r\n\f]+”来查找字符串中包含的行数。我的代码如下: pattern = Pattern.compile("[\\r\\n\\f]+") String[] lines = pattern.split(texts); 在我的单元测试中,我得到了如下示例字符串: "\t\t\t \r\n \n" "\r\n" 解析第一个字符串的结果是2,但是当解析第二个字符串时,它变为0 我认为第二个字符串包含1行,尽管该行是“空白”(假设我正在编辑一个文本编辑器中以

我有一个正则表达式“[\r\n\f]+”来查找字符串中包含的行数。我的代码如下:

pattern = Pattern.compile("[\\r\\n\\f]+")
String[] lines = pattern.split(texts);
在我的单元测试中,我得到了如下示例字符串:

"\t\t\t    \r\n      \n"
"\r\n"
解析第一个字符串的结果是2,但是当解析第二个字符串时,它变为0

我认为第二个字符串包含1行,尽管该行是“空白”(假设我正在编辑一个文本编辑器中以“\r\n”开头的文件,插入符号是否应该放在第二行?)。我的正则表达式解析行是否不正确?还是我在这里遗漏了什么

编辑:

我想我会让问题变得更明显:

为什么

但是

发件人:

该方法的工作原理类似于使用给定的输入序列和零的极限参数调用双参数split方法。因此,结果数组中不包括尾随的空字符串

许多人会同意,这种行为令人困惑地前后矛盾。您可以通过包含负数限制来禁用尾随空格的删除(所有负数的作用相同):


什么算一条线实际上取决于您的环境。 引自:

LF:Multics、Unix和类Unix系统(GNU/Linux、OS X、FreeBSD、, AIX、Xenix等)、BeOS、Amiga、RISC OS等

CR:Commodore 8位机器、Acorn BBC、ZX频谱、TRS-80、苹果 II系列,Mac OS至版本9和OS-9

RS:QNX预POSIX实现。0x9B:Atari 8位机器使用 ATASCII是ASCII的变体。(十进制155)

LF+CR:Acorn BBC和RISC OS假脱机文本输出

CR+LF:Microsoft Windows、12月TOPS-10、RT-11和大多数其他早期版本 非Unix和非IBM操作系统、CP/M、MP/M、DOS(MS-DOS、PC-DOS等), 雅达利TOS、OS/2、Symbian操作系统、Palm操作系统、阿姆斯特拉德CPC

也许你应该尝试一种绝对中立的方法:

    String test = "\t\t\t    \r\n      \n";
    BufferedReader reader = new BufferedReader(new StringReader(test));
    int count = 0;
    String line=null;
    while ((line=reader.readLine()) != null) {
        System.out.println(++count+":"+line);
    }
    System.out.println("total lines == "+count);

编辑内容包括Alan Moore关于使用
.ready()

Oops!这似乎打破了一切。Split“\t\t\t\r\n\n”给我3,“\r\n”给我2,这更让人困惑……抛出尾随空字符串的默认行为是从Perl的
Split()复制的
。不幸的是,这就是被复制的所有内容。我特别怀念的一个功能是抛出所有空字符串的能力。@shunsun split处理分隔符。也就是说,介于事物之间的事物。如果您想要终止符(非常典型的行尾)然后您需要忽略它的最后一个元素为空。如果它不是空的,您需要确定这是否是一个错误。假设您不认为这是一个错误,类似的方法应该可以工作:
numLines=lines.length;If(lines.length>0&&lines[lines.length-1].isEmpty())numLines--;
这确实满足了我的要求(稍加修改。while循环是一个无限循环)。但是,这是在不使用任何第三方库和讨论第三方库(例如Apache Common)的情况下按行正确分割文本块的唯一方法吗,他们使用什么正则表达式来分割行?我不确定这是唯一正确的方法,也不确定这是否是最正确的方法,但它应该可以移植到所有行结尾。它看起来像是
readLine()
(根据java 1.7文档)正在查找
换行符('\n')、回车符('\r')中的任何一个,或回车后紧接着换行符。
。您应该能够用它生成正则表达式。如果几年后新的文件格式被普遍使用,您的正则表达式可能不再工作。
BufferedReader.readLine()
(希望如此)仍然会。嗯,不确定这是否回答了我的问题。请参阅上面我更新的问题。OTBI(主题外但很重要):这不是使用
ready()
方法的方式。请查看详细信息。
// notice there's no trailing space in the string 
"\r\n".split("\r\n").length == 0 // results in an empty array. Why "" (empty string) is not in the result and this block of text contains 0 lines?
String[] lines = pattern.split(texts, -1);
    String test = "\t\t\t    \r\n      \n";
    BufferedReader reader = new BufferedReader(new StringReader(test));
    int count = 0;
    String line=null;
    while ((line=reader.readLine()) != null) {
        System.out.println(++count+":"+line);
    }
    System.out.println("total lines == "+count);