扫描仪只能识别CR LF

时间:2012-01-13 10:13:10

标签: java java.util.scanner

我正在使用扫描仪类读取文件。我希望我的EOL分隔符为CR LF,但文件中有一些只有LF的记录,因此我的扫描仪正在读取LF并转到下一行。我希望扫描仪只有在遇到CR LF时才能进入下一行 这是我的片段:(在正则表达式中使用双斜杠也会得到相同的结果)

java.util.Scanner sMain = new java.util.Scanner(inputStream,encoding)
                              .useDelimiter(Pattern.compile("[\r\n]"));
while (sMain.hasNextLine()) {  
// sysout line  
}

3 个答案:

答案 0 :(得分:1)

所以你想要一个

的分隔符
"\r\n"

"[\r\n]"表示\ r或\ n。

中的一个

分隔符确定“单词”之间的分隔符。要分解该行,您可以使用split(“〜”),如下所示。

ByteArrayInputStream inputStream = new ByteArrayInputStream((
        "a line~with a \r and~a \n in it \r\n" +
        "a line with \n\r in~it\r\n").getBytes());

Scanner sMain = new Scanner(inputStream,"UTF-8").useDelimiter("\r\n");
Pattern wordPattern = Pattern.compile("~");
while (sMain.hasNext()) {
    String line = sMain.next();
    line = line.replaceAll("\r", "\\\\r").replaceAll("\n", "\\\\n");
    String[] words = wordPattern.split(line);
    System.out.println(Arrays.toString(words));
}

打印

[a line, with a \r and, a \n in it ]
[a line with \n\r in, it]

答案 1 :(得分:1)

扫描后可能正在打印它。问题不在于Regex。彼得是对的: 以下是正确的:

"\r\n"

但请记住,如果您打印,单个\ n或\ r仍然被视为换行符。所以它可能看起来更多。以下测试代码澄清了它:

public class ScannerTest {

 public static void main(String[] args) {
   Scanner sc = new Scanner("I am first \r\n I am second \n Am I? \r Really?");
   sc.useDelimiter(Pattern.compile("\r\n"));
   int count=0;
   while (sc.hasNext()) {
          count++;
          System.out.println(sc.next());      
   }

   System.out.println("Total No of Lines:"+count);

   }

} 

注意不行。扫描仪读取的行数是2。

答案 2 :(得分:0)

尝试(\r\n|\r|\n),正则表达式引擎默认尝试首先匹配第一个选项。