删除所有空行

时间:2010-11-08 11:29:12

标签: java regex string

我认为这并不难,但我想用String.replaceAll删除所有空行(或者只包含Java中的空格和制表符的行)。

我的正则表达式如下:

s = s.replaceAll ("^[ |\t]*\n$", "");

但它不起作用。

我环顾四周,但只找到了用于删除没有空格或标签的空行的正则表达式。

8 个答案:

答案 0 :(得分:73)

试试这个:

String text = "line 1\n\nline 3\n\n\nline 5";
String adjusted = text.replaceAll("(?m)^[ \t]*\r?\n", "");
// ...

请注意,正则表达式[ |\t]匹配空格,制表符或管道字符!

修改

B.t.w。,正则表达式(?m)^\s+$也可以做到这一点。

答案 1 :(得分:4)

我不知道Java中正则表达式的语法,但/^\s*$[\n\r]{1,}/gm是你正在寻找的正则表达式。

你可能在Java中这样写:

s = s.replaceAll("(?m)^\\s*$[\n\r]{1,}", "");

我用JavaScript测试过它,效果很好。

答案 2 :(得分:3)

您可以使用以下代码从代码中删除空行:

String test = plainTextWithEmptyLines.replaceAll("[\\\r\\\n]+","");

这里,plainTextWithEmptyLines表示具有空行的字符串。 [\\\r\\\n]是正则表达式模式,用于标识空行换行符。

答案 3 :(得分:3)

我不是日常的Java程序员,所以我很惊讶JDK中没有比正则表达式更简单的方法。

反正

s = s.replaceAll("\n+", "\n");

会更简单。

<强>更新

抱歉,我错过了您想要删除空格和标签页。

s = s.replaceAll("\n[ \t]*\n", "\n");

如果你有一致的换行符就行了。如果没有,您可能需要考虑使它们保持一致。 E.g:

s = s.replaceAll("[\n\r]+", "\n");
s = s.replaceAll("\n[ \t]*\n", "\n");

答案 4 :(得分:1)

我有一些代码没有使用regexp,只需导入org.apache.commons.lang3.StringUtils;

  File temporaire = new File("temp.txt");
  try {
    Scanner scanner = new Scanner(yourfile);
    BufferedWriter bw = new BufferedWriter(new FileWriter(temporaire));
    while (scanner.hasNextLine()) {
      String line = StringUtils.stripEnd(scanner.nextLine(),null); // Clean blanks at the end of the line
      if (StringUtils.isNotBlank(line)) {
        bw.write(line); // Keep the line only if not blank
        if (scanner.hasNextLine()){
          // Go to next line (Win,Mac,Unix) if there is one
          bw.write(System.getProperty("line.separator"));
        }
      }
      bw.flush();
    }
    scanner.close();
    bw.close();
    fichier.delete();
    temporaire.renameTo(fichier);
  }
  catch (FileNotFoundException e) {
    System.out.println(e.getMessage());
  }
  catch (IOException e) {
    System.out.println(e.getMessage());
  }
}

答案 5 :(得分:1)

如果要从Microsoft Office,Windows或支持正则表达式呈现的文本编辑器中删除行:

 1. Press <kbd>Ctrl</kbd> + <kbd>F</kbd>.
 2. Check the regular expression checkbox
 3. Enter Expression ^\s*\n into the find box as it is.

您将看到编辑器中的所有黑色空格消失......

答案 6 :(得分:0)

Bart Kiers's answer缺少边缘情况,其中字符串的最后一行为空或包含空格。

如果您尝试

                   <div class="col-sm-4">
                    <?php $i = 1 ?>
                    <?php $posts = get_posts(array(
                        'post_type' => 'astroalbums',
                        'posts_per_page' => -1
                        ));
                        foreach ($posts as $post) : start_wp(); ?>
                    <?php if ($i == 1): ?>
                    <?php $link = get_permalink($post->ID); ?>
                    <?php the_title( '<h3 class="entry-title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">', '</a></h3>' );?>
                    <a href="<?php the_permalink(); ?>"><?php the_post_thumbnail(); ?></a>
                    <?php endif; ?>
                    <?php if($i == 3){$i = 1;} else {$i++;} ?>
                    <?php endforeach; ?>

你会得到一个等于这个

的字符串
SELECT sub.Name, sub.Genre, MAX(rent_number)
FROM (
    SELECT User.Name, Film.Genre, Count(User.ID) as rent_number
    FROM Film
      INNER JOIN Rent ON Film.Title = Rent.Film_Title
      INNER JOIN User ON Rent.User_ID = User.ID
    GROUP BY User.Name, Film.Genre) sub 
GROUP BY sub.Genre

结果。

我扩展Bart Kiers'的答案也涵盖了这个案例。

我的正则表达式是:

String text = "line 1\n\nline 3\n\n\nline 5\n "; // <-- Mind the \n plus space at the end!
String adjusted = text.replaceAll("(?m)^[ \t]*\r?\n", "");

一点解释:

模式的第一部分与Bart Kiers'基本相同。没关系,但它不会删除“空”的最后一行或包含空格的最后一行。

这是因为仅包含空格的最后一行不以"line 1\nline 3\nline 5\n " // <-- MIND the \n plus space at the end! 结尾,因此不会匹配/替换。我们需要一些东西来表达这种边缘情况。这就是第二部分(在String pattern = "(?m)^\\s*\\r?\\n|\\r?\\n\\s*(?!.*\\r?\\n)"; 之后)进来的地方。

它使用正则表达式专长:负向前瞻。这是模式的\\r?\\n部分。 |标志着先行的开始。您可以将其读作:匹配前瞻之前的正则表达式,如果它后面没有任何被定义为必须不遵循的字符串。在我们的例子中:不是任何字符(零次或多次),后面是回车(0或1次)和换行符:(?!.*\\r?\\n)(?!关闭了前瞻。前瞻本身并不是比赛的一部分。

如果我执行以下代码段:

.*\\r?\\n

我明白了:

inputString:
+----

Line  2 - above line is empty without spaces
Line  3 - next is empty without whitespaces

Line  5 - next line is with whitespaces

Line  7 - next 2 lines are "empty". First one with whitespaces.


Line 10 - 3 empty lines follow. The 2nd one with whitespaces in it. One whitespace at the end of this line



----+
ajdustedString:
+----
Line  2 - above line is empty without spaces
Line  3 - next is empty without whitespaces
Line  5 - next line is with whitespaces
Line  7 - next 2 lines are "empty". First one with whitespaces.
Line 10 - 3 empty lines follow. The 2nd one with whitespaces in it. One whitespace at the end of this line |EOS
----+

如果您想了解有关前瞻/后视的更多信息,请参阅Regex Tutorial - Lookahead and Lookbehind Zero-Length Assertions:

答案 7 :(得分:0)

此方法仅通过 java 删除空行:

private String removeEmptyLines(String text) {
    final String[] strings = text.split("\n");
    StringBuilder result = new StringBuilder();
    for (int i = 0, stringsLength = strings.length; i < stringsLength; i++) {
        String str = strings[i];
        if (str.isEmpty()) continue;
        result.append(str);
        if (i + 1 == stringsLength) continue;
        result.append("\n");
    }
    return result.toString();
}