Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式:规范化所有转义或非转义的换行符-为什么失败?_Java_Regex_Replaceall - Fatal编程技术网

Java正则表达式:规范化所有转义或非转义的换行符-为什么失败?

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

我试图将字符串中的任何换行符或转义换行符规范化为转义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
有人能解释一下吗? 我知道我可以把它分成两个电话,但现在我很好奇

编辑: 看来我应该更努力地寻找。看起来在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”
)实际上应该与模式的右侧匹配,但在修改替换的左侧时,它会停止匹配。