我正在尝试将字符串中的所有换行符或转义的换行符标准化为转义的unix换行符。我不知道为什么这不起作用:

Pattern EOL = Pattern.compile("(\\\\r)?\\\\n|\r?\n");
final String escapedEOL = "\\\\n";

System.out.println(EOL.matcher("asdf\njkl;").replaceAll(escapedEOL));
System.out.println(EOL.matcher("asdf\n").replaceAll(escapedEOL));
System.out.println(EOL.matcher("asdf\r\njkl;").replaceAll(escapedEOL));
System.out.println(EOL.matcher("asdf\r\n").replaceAll(escapedEOL));
System.out.println(EOL.matcher("asdf\\r\\njkl;").replaceAll(escapedEOL));
System.out.println(EOL.matcher("asdf\\r\\n").replaceAll(escapedEOL));


结果:

asdf\njkl;
asdf

asdf\njkl;
asdf\n
asdf\njkl;
asdf\n
Done


谁能对此有所启示?
我知道我可以将其分为两个呼叫,但是现在我很好奇...

编辑:
看来我应该更努力地搜索similar problems。在Java 7中,应避免使用带有组的量词。

Pattern EOL = Pattern.compile("\\\\n|\\\\r\\\\n|\r?\n")


也可以。

最佳答案

我不确定为什么,但是更改正则表达式中的顺序似乎可以按照您的意愿进行,所以请更改

Pattern EOL = Pattern.compile("(\\\\r)?\\\\n|\r?\n");




Pattern EOL = Pattern.compile("\r?\n|(\\\\r)?\\\\n");


Demo

无论如何,它看起来更像是错误,而不是预期的行为,并且在Java 8中已进行了更改,因此原始的正则表达式也会导致

asdf\njkl;
asdf\n
asdf\njkl;
asdf\n
asdf\njkl;
asdf\n

10-07 15:50