Java replaceAll从空行中删除空格

时间:2016-11-05 21:51:25

标签: java regex

我正在尝试从包含空格的文本块中的行中删除所有空格,从而保留换行符。

我尝试了以下内容:

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"

该区块第三行的空间尚未移除。我在这里做错了什么?

3 个答案:

答案 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>