我正在使用扫描仪类读取文件。我希望我的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
}
答案 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)
,正则表达式引擎默认尝试首先匹配第一个选项。