为什么" \ r \ n" .split(" \ r \ n")会返回一个空数组?

时间:2014-05-30 17:41:50

标签: java regex string newline text-processing

我有正则表达式" [\ r \ n \ f] +"查找String中包含的行数。我的代码是这样的:

pattern = Pattern.compile("[\\r\\n\\f]+")
String[] lines = pattern.split(texts);

在我的单元测试中,我有这样的示例字符串:

"\t\t\t    \r\n      \n"
"\r\n"

解析第一个字符串的结果是2,但是当它解析第二个字符串时它变为0。

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

修改:

我想我会让问题更加明显:

为什么

// notice the trailing space in the string
"\r\n ".split("\r\n").length == 2 // results in 2 strings {"", " "}. So this block of text has two lines.

// 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?

2 个答案:

答案 0 :(得分:5)

来自the documentation for Pattern.split(CharSequence)

  

此方法的作用就像通过调用给定输入序列和limit参数为零的双参数split方法一样。因此,尾随空字符串不包含在结果数组中。

许多人会同意这种行为容易引起混淆。您可以通过包含负限制来禁用尾随空白的删除(所有负值都执行相同的操作):

String[] lines = pattern.split(texts, -1);

答案 1 :(得分:0)

什么算作一条线真的取决于你的环境。 引自wikipedia

  

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

     

CR:Commodore 8位机器,Acorn BBC,ZX Spectrum,TRS-80,Apple   II系列,Mac OS最高版本9和OS-9

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

     

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

     

CR + LF:Microsoft Windows,DEC TOPS-10,RT-11和其他大多数早期版本   非Unix和非IBM操作系统,CP / M,MP / M,DOS(MS-DOS,PC DOS等),   Atari TOS,OS / 2,Symbian OS,Palm OS,Amstrad 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()

的说明