我正在尝试从包含空格的文本块中的行中删除所有空格,从而保留换行符。
我尝试了以下内容:
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 :(得分:3)
使用MULTILINE
标记,以便$
和str.replaceAll("(?m)^ +$", "")
匹配每行的开头和结尾。正则表达式的问题在于它正在捕获换行符,因此下一个匹配将超过它,并且无法匹配。
<html>
<head>
<title></title>
<link type="text/css" rel="stylesheet" href="CSS/mainPageStyle.css">
</head>
<body style="background-color:white">
<div id="titleLogo"><h1>Custom Motorbikes</h1></div>
<nav>
<ul>
<li><a href="">Home</a></li>
<li><a href="">About Us</a></li>
<li><a href="">Full ride list</a></li>
<li><a href="">Custom ride</a></li>
<li><a href="">Contact Us</a></li>
<li><a href="">Login</a></li>
<li><a href="">Register</a></li>
</ul>
</nav>
<!-- front page slideshow: -->
<img src="images/bikePerson.jpg" class="slides" style="width:100%" />
<img src="images/bikePersonCountry.jpg" class="slides" style="width:100%" />
<img src="images/bikeRoad.jpg" class="slides" style="width:100%" />
<a href="#" onclick="changeImage(1); return false;">Next Slide</a> <br/>
<a href="#" onclick="changeImage(-1); return false;">Previous Slide</a>
<!-- front page slideshow -->
<script type="text/javascript" src='JS/slideshow.js'></script>
</body>
</html>
答案 1 :(得分:2)
您需要仅使用水平空格匹配行,并且Pattern.MULTILINE
和^
锚点需要$
修饰符才能匹配行的开头和结尾分别(其嵌入选项为(?m)
)。使用
String str = " text\n \n \n text";
str = str.replaceAll("(?m)^[\\p{Zs}\t]+$", "");
请参阅Java demo。
<强>详情:
(?m)
- 多线模式^
- 行首[\\p{Zs}\t]+
- 一个或多个水平空格$
- 行尾。 [\p{Zs}\t]
的替代方案是匹配除垂直空白符号之外的任何空格的模式。在Java中,字符类减法可以很方便:[\s&&[^\r\n]]
其中[\s]
匹配任何空格,&&[^\r\n]
从中排除回车符和换行符。完整模式看起来像.replaceAll("(?Um)^[\\s&&[^\r\n]]+$", "")
。
答案 2 :(得分:1)
使用锚点:
str = str.replaceAll("(?m)^[^\\S\\n]+$", "");
当多线标志^
开启时,$
和(?m)
分别匹配线的起点和终点。
您的模式的问题是您在水平空格\\n
周围使用replaceAll("(\\n +\\n)", "\n\n")
(模式中的简单空格)。如果这样做,则无法获得连续的结果,因为您无法将相同的字符匹配两次。
注意:如果您想要考虑Windows或旧的Mac行尾,请在字符类中添加\\r
(将其排除为\\n
)。 / p>