Scala中replaceAll处理末尾带换行符字符串的正则异常咨询
正则替换问题分析与解决
先看两段Scala代码的执行结果:
scala> "foo\nbar".replaceAll("\n[^\n]+$", "#") val res78: String = foo# // <- 符合预期
scala> "foo\nbar\n".replaceAll("\n[^\n]+$", "#") val res77: String = "foo# // <- 不符合预期 "
问题原因
你的推测完全正确:正则里的$默认会匹配字符串末尾换行符之前的位置。当字符串以\n结尾时,$的位置落在最后那个换行符前面,此时正则\n[^\n]+$会匹配从倒数第二个\n开始、到$(最后一个\n之前)的内容——也就是\nbar,替换成#后,原本末尾的\n没被匹配到,自然就保留了下来。
解决方案
把正则里的$换成\z即可。\z是正则的绝对结束锚点,只会匹配整个字符串的最后位置,不会忽略末尾的换行符。修改后的代码执行结果如下:
scala> "foo\nbar\n".replaceAll("\n[^\n]+\\z", "#") val res79: String = foo#
内容的提问来源于stack exchange,提问作者Dima
相关产品推荐
相关产品推荐

