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

129

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

Confiqure
источник
Возможный дубликат удаления пробелов из строк в Java
Alex K
1
Нет, это не так. Вопрос в ссылке скорее касается «заменить» ..
Faiz

Ответы:

278

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

String trimmedString = myString.trim();
Crozin
источник
18
Вопрос о новых строках. Это удаляет не только новые строки
ммм
21
String.replaceAll("[\n\r]", "");
Джон Б.
источник
14
Бро, @JohnB Он также удалит все символы новой строки между строкой. просим удалить только начальный и конечный символы новой строки.
siddhartha
5

ТЛ; др

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

String::strip…

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

Как обсуждалось здесь , Java 11 добавляет strip…в Stringкласс новые методы . В них используется более понятное определение пробелов в Юникоде. См. Правила этого определения в классе 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 + 000A LINE FEED.
  • Это '\ u000B', ВЕРТИКАЛЬНАЯ ТАБЛИЦА U + 000B.
  • Это '\ f', U + 000C FORM FEED.
  • Это '\ r', ВОЗВРАТ ПЕРЕВОЗКИ U + 000D.
  • Это '\ u001C', U + 001C FILE SEPARATOR.
  • Это '=', U + 001D ГРУППОВОЙ СЕПАРАТОР.
  • Это '\ u001E', U + 001E ЗАПИСЬ СЕПАРАТОР.
  • Это '\ u001F', U + 0
Василий Бурк
источник
4

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

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

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

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

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

String.replaceAll("^[\n\r]", "")
Александр Самойлов
источник
Не могли бы вы дать дополнительный контекст своему ответу? Таким образом, каждый сможет понять, что делает ваш код и почему.
Мариано Соррилья,
Я добавил пояснения к своему ответу. Надеюсь, теперь все ясно.
Александр Самойлов
2

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

entpnerd
источник
1
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]
hmmh
источник
1

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

Используйте регулярные выражения для удаления возврата каретки ( \\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<
slartidan
источник
0

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

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

// 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] + "-");

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

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

Zhro
источник
Да, но что, если вы не знаете, сколько строк в начале / конце? Ваше решение предполагает, что в обоих случаях есть ровно 2 символа новой строки
Luka Govedič
Второй параметр split()- это просто предел. Отключите его, если хотите совпадать неограниченное количество раз.
Жро
0

Попробуй это

function replaceNewLine(str) { 
  return str.replace(/[\n\r]/g, "");
}
Jobelle
источник
-3
String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");
хан
источник
2
Это неверный ответ на вопрос. Удаляются все CR и LF, а не только в начале и в конце.
james.garriss
Это заменит все, а не только с начала и до конца.
Hamzeh Soboh