Java 使用replaceAll从多行字符串中的每一行修剪尾部空白
请解释为什么在这个表达式中,替换只在字符串末尾发生一次Java 使用replaceAll从多行字符串中的每一行修剪尾部空白,java,regex,Java,Regex,请解释为什么在这个表达式中,替换只在字符串末尾发生一次 "1 \n3 \n5 ".replaceAll(" +$", "x") // => "1 \n3 \n5x" 据报道,, $应与行的结尾匹配,\z应与输入(字符串)的结尾匹配 我的目标是替换字符串中每行末尾的尾随空格。“x”替换仅仅是更好地可视化被替换内容的一种方式 我认为正则表达式和String.replaceAll应该能够做到这一点。如果replaceAll无法执行此操作,请建议一个简明的替代方法。要替换每行的尾随空格
"1 \n3 \n5 ".replaceAll(" +$", "x") // => "1 \n3 \n5x"
据报道,,
$
应与行的结尾匹配,\z
应与输入(字符串)的结尾匹配
我的目标是替换字符串中每行末尾的尾随空格。“x”
替换仅仅是更好地可视化被替换内容的一种方式
我认为正则表达式和String.replaceAll应该能够做到这一点。如果
replaceAll
无法执行此操作,请建议一个简明的替代方法。要替换每行的尾随空格,需要使用(?m)
(多行)修饰符
"1 \n3 \n5 ".replaceAll("(?m) +$", "x") //=> "1x\n3x\n5x"
注意:此修饰符使
^
和$
在每行的开头和结尾匹配。hwnd的答案确实是最简洁的方法。然而,特别是如果模式需要多次匹配,我想建议一种更快的替代方案。是的,这叫做预编译模式!(相反,String#replaceAll
在每次调用时重新编译模式。)
是的,它看起来更笨重,这是因为Java没有regexp文本。我希望如此,但人们会想要JSON文本、XML文本(比如E4X)、XPath表达式文本、
printf
format string文本、SQL语句文本等,然后人们会问这种疯狂何时会停止。:-) 你不只是让人们要求这些,再加上regexp文本吗?;-)
private static final Pattern LINE_END_SPACES = Pattern.compile(" +$", Pattern.MULTILINE);
public static String stripLineEndSpaces(String str) {
return LINE_END_SPACES.matcher(str).replaceAll("");
}