Подтвердить что ты не робот

Удалить все пустые строки

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

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

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

4b9b3361

Ответ 1

Попробуйте следующее:

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

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

ИЗМЕНИТЬ

B.t.w., regex (?m)^\s+$ также выполнит трюк.

Ответ 2

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

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

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

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

Ответ 3

У меня есть код без использования 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());
}
}

Ответ 4

Изменить. Если вы хотите удалить строки из офиса MS, Windows или Редактора, которые поддерживают рендеринг регулярных выражений

 1. Press Ctrl+ f.
 2. Check Regular Expression checkbox
 3. Enter Expression ^\s*\n into  find box as it is.

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

Ответ 5

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

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

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

Ответ 6

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

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

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

будет немного проще.

Update:

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

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

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

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

Ответ 7

Самый приемлемый ответ (fooobar.com/info/243879/...) на этот вопрос уже несколько лет, но так как я наткнулся на него как первое предложение на поиск "java remove пустая строка из строки" в моей поисковой системе, и я считаю, что она неполна. Я решил опубликовать свое решение. На мой взгляд, это недостаток, когда последняя строка строки пуста или содержит пробелы.

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

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!

. Я расширил Bart Kiers, чтобы ответить на этот вопрос.

Мой шаблон регулярного выражения:

String pattern = "(?m)^\\s*\\r?\\n|\\r?\\n\\s*(?!.*\\r?\\n)";

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

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

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

Он использует специальную функцию регулярного выражения: негативный просмотр. Это часть (?!.*\\r?\\n) шаблона. (?! обозначает начало просмотра. Вы можете прочитать это как: сопоставить регулярное выражение перед lookahead, если за ним не следует то, что определено как строка, которая не должна следовать. В нашем случае: ни один символ (ноль или более раз), за которым следует возврат каретки (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, см. Учебное пособие по регулярному выражению - Утверждения с нулевой длиной Lookahead и Lookbehind: