Java正则表达式:规范化所有转义或非转义的换行符-为什么失败?
我试图将字符串中的任何换行符或转义换行符规范化为转义unix换行符。我不明白为什么这不起作用:Java正则表达式:规范化所有转义或非转义的换行符-为什么失败?,java,regex,replaceall,Java,Regex,Replaceall,我试图将字符串中的任何换行符或转义换行符规范化为转义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").r
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
有人能解释一下吗?
我知道我可以把它分成两个电话,但现在我很好奇
编辑:
看来我应该更努力地寻找。看起来在Java7中应该避免使用带组的量词
Pattern EOL = Pattern.compile("\\\\n|\\\\r\\\\n|\r?\n")
同样有效。我不知道为什么,但在正则表达式中更改顺序似乎可以按照您可能希望的方式工作,所以请更改
Pattern EOL = Pattern.compile("(\\\\r)?\\\\n|\r?\n");
到
无论如何,它看起来更像bug,而不是期望的行为,并且在Java8中进行了更改,所以您的原始正则表达式也将在这里使用
asdf\njkl;
asdf\n
asdf\njkl;
asdf\n
asdf\njkl;
asdf\n
我不知道为什么,但在你的正则表达式中改变顺序似乎像你想要的那样工作,所以改变
Pattern EOL = Pattern.compile("(\\\\r)?\\\\n|\r?\n");
到
无论如何,它看起来更像bug,而不是期望的行为,并且在Java8中进行了更改,所以您的原始正则表达式也将在这里使用
asdf\njkl;
asdf\n
asdf\njkl;
asdf\n
asdf\njkl;
asdf\n
将
|
的左侧分组似乎可以让事情顺利进行:
Pattern EOL = Pattern.compile("((\\\\r)?\\\\n)|\r?\n");
将
|
的左侧分组似乎可以让事情顺利进行:
Pattern EOL = Pattern.compile("((\\\\r)?\\\\n)|\r?\n");
我在Java 8上得到了不同的结果。啊,这是在
Java(TM)SE运行时环境(build 1.7.0_45-b18)
。。。不幸的是,我不能升级到8。我在Java 8上得到了不同的结果。啊,这是在Java(TM)SE运行时环境(build 1.7.0_45-b18)
。。。不幸的是,我不能升级到8。真奇怪。谢谢,看来从现在起我将对Java中使用的任何正则表达式进行三重检查…很好的故障排除,还有一个Java正则表达式错误+真奇怪。谢谢,看来从现在起我将对Java中使用的任何正则表达式进行三重检查…很好的故障排除,还有一个Java正则表达式错误+1+1,这也是一种有趣的方法,因为这些外圆括号在这里没有任何意义。@Pshemo删除可选的?
也可以使它工作<代码>\\\\r\\\\n\r?\n(但ofc.改变了含义)。有趣的是,模式失败的用例(“asdf\n”
)实际上应该是模式右侧的匹配,但当修改替换的左侧时,它会停止匹配。+1,这也是一种有趣的方法,因为这些外圆括号在这里没有任何意义。@Pshemo删除可选的?
也可以使它工作<代码>\\\\r\\\\n\r?\n(但ofc.改变了含义)。有趣的是,模式失败的用例(“asdf\n”
)实际上应该与模式的右侧匹配,但在修改替换的左侧时,它会停止匹配。