请解释为什么在这个表达式中,替换只发生一次,在字符串的末尾。
"1 \n3 \n5 ".replaceAll(" +$", "x") // => "1 \n3 \n5x"
根据Java 7 docs for Pattern,
$
应该匹配一行的结尾,\z
匹配输入的结尾(字符串)。
我的目标是替换字符串中每一行末尾的尾部空格。 "x"
替换只是一种更好地可视化被替换内容的方法。
我认为正则表达式和String.replaceAll应该能够做到这一点。如果replaceAll
无法执行此操作,请提供简明的替代方案。
答案 0 :(得分:10)
要替换每行的尾部空格,您需要使用(?m)
(多行)修饰符。
"1 \n3 \n5 ".replaceAll("(?m) +$", "x") //=> "1x\n3x\n5x"
注意:此修饰符会在每行的开头和结尾处匹配^
和$
。
答案 1 :(得分:4)
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语句文字等,然后人们会问疯狂什么时候会停。 : - )