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"
在块的第三行中的空间没有被删除。我在这里做错了什么?
你需要匹配,只有水平空间线,并在需要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]]+$", "")
。
使用锚:
str = str.replaceAll("(?m)^[^\\S\\n]+$", "");
凡^
和$
比赛分别开始和行结束时,多标志(?m)
接通。
您的模式的问题是,您使用\\n
围绕水平空格replaceAll("(\\n +\\n)", "\n\n")
(您的模式中的简单空格)。如果你这样做,你不能获得连续的结果,因为你不能匹配两次相同的人物。
注:添加最终\\r
在字符类(将其排除为\\n
)如果你想利用帐户的Windows或线条的旧的Mac结束。
使用MULTILINE
标志,以便^
和$
将匹配每行的开始和结束。你的正则表达式的问题是它正在捕获换行符,所以下一场比赛将超过它,并且无法匹配。
str.replaceAll("(?m)^ +$", "")
感谢大家提供的信息。大量工作 - 非常感谢! –
请检查并选择最适合您的答案。 –