使用replaceAll函数从多行字符串中删除每行末尾的空格

4
请解释为什么在这个表达式中,替换只发生一次,在字符串的末尾。
"1  \n3  \n5  ".replaceAll(" +$", "x") // => "1  \n3  \n5x"

根据Java 7 Pattern文档$应匹配行尾,\z匹配输入(字符串)的结尾。
我的目标是替换字符串中每行末尾的空白字符。 "x" 替换仅是更好地可视化被替换的内容。
我认为正则表达式和String.replaceAll应该能够完成此操作。如果 replaceAll 无法执行此操作,请建议一个简明的替代方法。
2个回答

10

如果你想替换每行末尾的空格,你需要使用 (?m)(多行)修饰符。

"1  \n3  \n5  ".replaceAll("(?m) +$", "x") //=> "1x\n3x\n5x"

注意:该修饰符使得^$匹配到每一行的开头和结尾。


4

hwnd的回答确实是最简洁的方法。然而,特别是当模式需要匹配很多次时,我想建议一种更快的替代方法。是的,它被称为预编译模式!(相比之下,String#replaceAll每次调用都会重新编译模式。)

private static final Pattern LINE_END_SPACES = Pattern.compile(" +$", Pattern.MULTILINE);

public static String stripLineEndSpaces(String str) {
    return LINE_END_SPACES.matcher(str).replaceAll("");
}

是的,它看起来更加笨重,这是因为Java没有regexp字面量。我希望它有,但是随后人们会想要JSON字面量、XML字面量(想象一下E4X)、XPath表达式字面量、printf格式字符串字面量、SQL语句字面量等等,然后人们就会问这种疯狂什么时候才能停止。 :-)


1
难道你不觉得人们会直接要求使用这些内容吗,还包括正则表达式字面量?;-) - Edward Anderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接