Java replaceAll从空行中删除空格

问题描述:

我试图从文本块中的行中删除所有空格,这些行中除空格之外什么都不包含,使行中断。Java replaceAll从空行中删除空格

我尝试以下:

str = " text\n \n \n text";  
str = str 
    .replaceAll("\\A +\\n", "\n") 
    .replaceAll("(\\n +\\n)", "\n\n") 
    .replaceAll("\\n +\\Z", "\n"); 

我期待的输出是

" text\n\n\n text" 

而是它是

" text\n\n \n text" 

在块的第三行中的空间没有被删除。我在这里做错了什么?

+0

请检查并选择最适合您的答案。 –

你需要匹配,只有水平空间线,并在需要Pattern.MULTILINE修改为^$锚分别匹配的线开始和结束(其隐含期权是(?m))。使用

String str = " text\n \n \n text"; 
str = str.replaceAll("(?m)^[\\p{Zs}\t]+$", ""); 

查看Java demo

详细

  • (?m) - 多行模式
  • ^ - 1或多个水平空格
  • $ - - 线的端线
  • [\\p{Zs}\t]+的开始。

一种替代[\p{Zs}\t]是匹配不含垂直空白符号的任何空白的图案。在Java中,可以方便地使用字符类减法:[\s&&[^\r\n]]其中[\s]与任何空格匹配,并且&&[^\r\n]从中排除回车符和换行符。完整模式看起来像.replaceAll("(?Um)^[\\s&&[^\r\n]]+$", "")

+0

它总是更好的细节:) – Treycos

+0

'\ p {Zs}'是什么?我似乎无法在[文档](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html)中找到它。它是否与'\ h'相同? – 4castle

+0

@ 4castle:不完全是,\ p {Zs}是一个Unicode属性类,它匹配所有Unicode水平空白字符,但是是一个制表符。所以,它不等于PCRE'\ h'。 –

使用锚:

str = str.replaceAll("(?m)^[^\\S\\n]+$", ""); 

^$比赛分别开始和行结束时,多标志(?m)接通。

您的模式的问题是,您使用\\n围绕水平空格replaceAll("(\\n +\\n)", "\n\n")(您的模式中的简单空格)。如果你这样做,你不能获得连续的结果,因为你不能匹配两次相同的人物。

注:添加最终\\r在字符类(将其排除为\\n如果你想利用帐户的Windows或线条的旧的Mac结束。

使用MULTILINE标志,以便^$将匹配每行的开始和结束。你的正则表达式的问题是它正在捕获换行符,所以下一场比赛将超过它,并且无法匹配。

str.replaceAll("(?m)^ +$", "") 
+0

感谢大家提供的信息。大量工作 - 非常感谢! –