Удалить все пустые строки - PullRequest
30 голосов
/ 08 ноября 2010

Я думал, что это не так сложно сделать, но я хочу удалить все пустые строки (или строки, содержащие только пробелы и табуляции в Java) с помощью String.replaceAll.

Мое регулярное выражение выглядит так:

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

Но это не работает.

Я оглянулся, но нашел только регулярные выражения для удаления пустых строк без пробелов и табуляции.

Ответы [ 7 ]

75 голосов
/ 08 ноября 2010

Попробуйте:

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

Обратите внимание, что регулярное выражение [ |\t] соответствует пробелу, табуляции или символу трубы!

РЕДАКТИРОВАТЬ

Кстати, регулярное выражение(?m)^\s+$ также сделает трюк.

4 голосов
/ 08 ноября 2010

Я не знаю синтаксис регулярных выражений в Java, но /^\s*$[\n\r]{1,}/gm - это искомое регулярное выражение.

Вы, вероятно, пишете это так на Java:

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

Я протестировал его с JavaScript, и он отлично работает.

3 голосов
/ 12 мая 2015

Я не повседневный Java-программист, поэтому я удивлен, что в JDK нет более простого способа сделать это, чем регулярное выражение.

В любом случае,

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

было бы немного проще.

Обновление:

Извините, я пропустил, что вы также хотели удалить пробелы и табуляции.

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

Будет работать, если у вас есть последовательные переводы строк.Если нет, вы можете рассмотреть вопрос о том, чтобы сделать их последовательными.Например:

s = s.replaceAll("[\n\r]+", "\n");
s = s.replaceAll("\n[ \t]*\n", "\n");
3 голосов
/ 22 ноября 2013

Вы можете удалить пустые строки из своего кода, используя следующий код:

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

Здесь plainTextWithEmptyLines обозначает строку, содержащую пустые строки.[\\\r\\\n] - это шаблон регулярного выражения, который используется для определения пустых разрывов строк.

1 голос
/ 28 сентября 2013

Если вы хотите удалить строки из 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.

Вы увидите, что все ваши черные пробелы в редакторе исчезают ...

1 голос
/ 06 марта 2012

У меня есть код без использования регулярных выражений, просто импортируйте 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());
  }
}
0 голосов
/ 05 января 2017

В ответе Барта Киерса отсутствует крайний случай, когда последняя строка строки пуста или содержит пробелы.

Если вы попробуете

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", "");

вы получите строку, равную этому

"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)";

Небольшое объяснение:

Первая часть шаблона в основном совпадает с Bart Kiers '. Это нормально, но не удаляет «пустую» последнюю или последнюю строку, содержащую пробелы.

Это потому, что последняя строка, содержащая только пробелы, не заканчивается на \\r?\\n и поэтому не будет сопоставлена ​​/ заменена. Нам нужно что-то, чтобы выразить этот крайний случай. Вот тут и начинается вторая часть (после |).

Используется специальность регулярного выражения: отрицательный взгляд . Это (?!.*\\r?\\n) часть шаблона. (?! отмечает начало предвкушения. Вы можете прочитать его так: Сопоставить регулярное выражение перед заглядыванием, если за ним не следует то, что определено как строка, которая не должна следовать. В нашем случае: ни один символ (ноль или более раз), за которым следует возврат каретки (0 или 1 раз) и символ новой строки: .*\\r?\\n. ) закрывает взгляд. Само предчувствие не является частью матча.

Если я выполню следующий фрагмент кода:

String pattern = "(?m)^\\s*\\r?\\n|\\r?\\n\\s*(?!.*\\r?\\n)";
String replacement = "";
String inputString =
        "\n" +
        "Line  2 - above line is empty without spaces\n" +
        "Line  3 - next is empty without whitespaces\n" +
        "\n" +
        "Line  5 - next line is with whitespaces\n" +
        "        \n" +
        "Line  7 - next 2 lines are \"empty\". First one with whitespaces.\n" +
        "        \r\n" +
        "\n" +
        "Line 10 - 3 empty lines follow. The 2nd one with whitespaces in it. One whitespace at the end of this line " +
        "\n" +
        "          \n" +
        "\n";

String ajdustedString = inputString.replaceAll(pattern, replacement);
System.out.println("inputString:");
System.out.println("+----");
System.out.println(inputString);
System.out.println("----+");
System.out.println("ajdustedString:");
System.out.println("+----");
System.out.print(ajdustedString); //MIND the "print" instead of "println"
System.out.println("|EOS"); //String to clearly mark the _E_nd _O_f the adjusted_S_tring
System.out.println("----+");

Я получаю:

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
----+

Если вы хотите узнать больше о lookahead / lookbehind, см. Regex Tutorial - Lookahead и Lookbehind Утверждения нулевой длины:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...