Как удалить символы новой строки из начала и конца строки (Java)?

У меня есть строка, содержащая некоторый текст, за которым следует пустая строка. Каков наилучший способ сохранить часть с текстом, но убрать пробел с новой строки?

6 ответов

Решение

Использование String.trim() метод избавления от пробелов (пробелы, новые строки и т. д.) от начала и конца строки.

String trimmedString = myString.trim();
String.replaceAll("[\n\r]", "");

Этот код Java делает именно то, что указано в заголовке вопроса, а именно "удаляет символы новой строки из начала и конца строки-java":

String.replaceAll("^[\n\r]", "").replaceAll("[\n\r]$", "")

Удаляйте символы новой строки только с конца строки:

String.replaceAll("[\n\r]$", "")

Удаляйте символы новой строки только с начала строки:

String.replaceAll("^[\n\r]", "")

ТЛ; др

String cleanString = dirtyString.strip() ; // Call new `String::string` method.

String::strip…

Старый String::trimМетод имеет странное определение пробелов.

Как обсуждалось здесь, Java 11 добавляет новые strip… методы к String учебный класс. Они используют более удобное для Unicode определение пробелов. Смотрите правила этого определения в классе JavaDoc для Character::isWhitespace,

Пример кода.

String input = " some Thing ";
System.out.println("before->>"+input+"<<-");
input = input.strip();
System.out.println("after->>"+input+"<<-");

Или вы можете убрать только начальные или конечные пробелы.

Вы не упоминаете, какие именно точки кода составляют ваши новые строки. Я полагаю, что ваш перевод строки включен в этот список кодов strip:

  • Это символ пробела Unicode (SPACE_SEPARATOR, LINE_SEPARATOR или PARAGRAPH_SEPARATOR), но он также не является неразрывным пробелом ('\u00A0', '\u2007', '\u202F').
  • Это '\t', U+0009 ГОРИЗОНТАЛЬНАЯ ТАБУЛЯЦИЯ.
  • Это '\ n', U + 000ALINE FEED.
  • Это '\u000B', U+000B ВЕРТИКАЛЬНАЯ ТАБЛИЦА.
  • Это '\ f', U + 000C ФОРМА.
  • Это 'R', U + 000D ВОЗВРАТ.
  • Это '\ u001C', РАЗДЕЛИТЕЛЬ ФАЙЛА U + 001C.
  • Это '\u001D', U+001D ГРУППОВОЙ СЕПАРАТОР.
  • Это "\ u001E", разделитель записей U + 001E.
  • Это '\u001F', U+0

Если ваша строка потенциально null рассмотрите возможность использования StringUtils.trim() - нулевая версия String.trim(),

Если вы хотите удалить разрывы строк (а не пробелы, табуляции) в начале и конце строки (не между ними), вы можете использовать этот подход:

Используйте регулярные выражения для удаления возврата каретки (\\r) и перевод строки (\\n) с самого начала (^) и окончание ($) строки:

 s = s.replaceAll("(^[\\r\\n]+|[\\r\\n]+$)", "")

Полный пример:

public class RemoveLineBreaks {
    public static void main(String[] args) {
        var s = "\nHello\nWorld\n";
        System.out.println("before: >"+s+"<");
        s = s.replaceAll("(^[\\r\\n]+|[\\r\\n]+$)", "");
        System.out.println("after: >"+s+"<");
    }
}

Он выводит:

before: >
Hello
World
<
after: >Hello
World<

Try this

function replaceNewLine(str) { 
  return str.replace(/[\n\r]/g, "");
}

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

Чтобы удалить переводы строк с самого начала:

// Trim left
String[] a = "\n\nfrom the beginning\n\n".split("^\\n+", 2);

System.out.println("-" + (a.length > 1 ? a[1] : a[0]) + "-");

и конец строки:

// Trim right
String z = "\n\nfrom the end\n\n";

System.out.println("-" + z.split("\\n+$", 2)[0] + "-");

Я уверен, что это не самый эффективный способ обрезки строки. Но, похоже, это самый чистый и простой способ провести такую ​​операцию.

Обратите внимание, что тот же метод может быть использован для обрезки любого варианта и комбинации символов с любого конца, поскольку это простое регулярное выражение.

String trimStartEnd = "\n TestString1 linebreak1\nlinebreak2\nlinebreak3\n TestString2 \n";
System.out.println("Original String : [" + trimStartEnd + "]");
System.out.println("-----------------------------");
System.out.println("Result String : [" + trimStartEnd.replaceAll("^(\\r\\n|[\\n\\x0B\\x0C\\r\\u0085\\u2028\\u2029])|(\\r\\n|[\\n\\x0B\\x0C\\r\\u0085\\u2028\\u2029])$", "") + "]");
  1. Начало строки = ^,
  2. Конец строки = $,
  3. регулярное выражение = |,
  4. Перевод строки = \r\n|[\n\x0B\x0C\r\u0085\u2028\u2029]

Для всех, кто ищет ответ на вопрос при работе с разными переносами строк:

string.replaceAll("(\n|\r|\r\n)$", ""); // Java 7
string.replaceAll("\\R$", "");          // Java 8

Это должно удалить точно последний разрыв строки и сохранить все остальные пробелы в строке и работать с разрывами строк Unix (\n), Windows (\r\n) и старым Mac (\r): /questions/14352021/sootvetstvie-perenosam-strok-n-ili-rn/14352042#14352042, /questions/14352021/sootvetstvie-perenosam-strok-n-ili-rn/14352029#14352029. "\\R"это сопоставитель, представленный в Java 8 в классе Pattern: https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

Это проходит следующие тесты:

// Windows:
value = "\r\n test \r\n value \r\n";
assertEquals("\r\n test \r\n value ", value.replaceAll("\\R$", ""));

// Unix:
value = "\n test \n value \n";
assertEquals("\n test \n value ", value.replaceAll("\\R$", ""));

// Old Mac:
value = "\r test \r value \r";
assertEquals("\r test \r value ", value.replaceAll("\\R$", ""));

Еще одно элегантное решение.

String myString = "\nLogbasex\n";
myString = org.apache.commons.lang3.StringUtils.strip(myString, "\n");
String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");
Другие вопросы по тегам