【发布时间】:2013-10-01 23:54:51
【问题描述】:
这是一件非常琐碎的事情:替换一行
- 可能包含尾随空格
- 以 '\n'、'\r'、'\r\n' 或无结尾
由不包含尾随空格并以 '\n' 结尾的行。
我想我可以通过一个简单的正则表达式来做到这一点。在这里,"\\s+$" 不起作用,因为 $ 在最终的 \n 之前匹配。这就是为什么有\\z。至少我是这么认为的。但是
"\n".replaceAll("\\s*\\z", "\n").length()
返回 2。实际上,$、\\z 和 \\Z 在这里执行完全相同的操作。我很困惑...
Alan Moore 的解释很有帮助,但我才刚刚想到,在 EOF 替换任意最终空白垃圾我可以做到
replaceFirst("\\s*\\z"", "\n");
而不是replaceAll。完成上述所有操作的简单解决方案是
replaceAll("(?<!\\s)\\s*\\z|[ \t]*(\r?\n|\r)", "\n");
恐怕,不是很快,但可以接受。
【问题讨论】: