Как удалить символы новой строки из начала и конца строки (Java)?
У меня есть строка, содержащая некоторый текст, за которым следует пустая строка. Каков наилучший способ сохранить часть с текстом, но убрать пробел с новой строки?
6 ответов
Использование String.trim()
метод избавления от пробелов (пробелы, новые строки и т. д.) от начала и конца строки.
String trimmedString = myString.trim();
Этот код 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])$", "") + "]");
- Начало строки = ^,
- Конец строки = $,
- регулярное выражение = |,
- Перевод строки = \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", "");