使用replaceAll修剪多行字符串中每行的尾随空格

时间:2014-08-01 02:25:37

标签: java regex

请解释为什么在这个表达式中,替换只发生一次,在字符串的末尾。

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

根据Java 7 docs for Pattern$应该匹配一行的结尾,\z匹配输入的结尾(字符串)。

我的目标是替换字符串中每一行末尾的尾部空格。 "x"替换只是一种更好地可视化被替换内容的方法。

我认为正则表达式和String.replaceAll应该能够做到这一点。如果replaceAll无法执行此操作,请提供简明的替代方案。

2 个答案:

答案 0 :(得分:10)

要替换每行的尾部空格,您需要使用(?m)(多行)修饰符。

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

注意:此修饰符会在每行的开头和结尾处匹配^$

答案 1 :(得分: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没有正则表达式文字。我希望它能做到,但人们会想要JSON文字,XML文字(想想E4X),XPath表达文字,printf格式字符串文字,SQL语句文字等,然后人们会问疯狂什么时候会停。 : - )