Убрать переносы строки java

Не понимаю немного

Почему у меня в end записывается только ravno? Я хочу удалить перенос строки, который делает System.out.println в методе printSomething(). Делаю это при помощи replace, но он стирает вообще всю строку. Что делать? Где моя ошибка?

package com.javarush.task.task19.task1914; /* Решаем пример */ import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.util.Arrays; public class Solution  public static TestString testString = new TestString(); public static void main(String[] args)  PrintStream maniOut = System.out; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); PrintStream secondOut = new PrintStream(byteArrayOutputStream); System.setOut(secondOut); testString.printSomething(); String[] charMassive = byteArrayOutputStream.toString().replace("\n", "").split(" "); System.setOut(maniOut); int ravno = 0; switch (charMassive[1]) case "+" : ravno = Integer.parseInt((charMassive[0])) + Integer.parseInt((charMassive[2])); break; case "-" : ravno = Integer.parseInt((charMassive[0])) - Integer.parseInt((charMassive[2])); break; case "*" : ravno = Integer.parseInt((charMassive[0])) * Integer.parseInt((charMassive[2])); break; > String end = byteArrayOutputStream.toString().replace("\n", "") + ravno; System.out.println(end); > public static class TestString  public void printSomething()  System.out.println("3 + 6 token punctuation">); > > >

Источник

Как удалить разрывы строк из файла в Java?

Как я могу заменить все разрывы строк из строки на Java таким образом, чтобы они работали в Windows и Linux (например, никаких проблем с конкретной ОС для возврата каретки/линии/новой строки и т.д.)? Я пробовал (примечание readFileAsString — это функция, которая читает текстовый файл в String):

String text = readFileAsString("textfile.txt"); text.replace("\n", ""); 

О, если вы хотите удалить все переводы строки, удалите все \ n И все \ r (потому что перевод строки Windows равен \ r \ n).

Эй, к вашему сведению, если вы хотите заменить одновременные myString.trim().replaceAll(«[\n]<2,>«, «\n») разрыв строки, вы можете использовать myString.trim().replaceAll(«[\n]<2,>«, «\n») или заменить на один space myString.trim().replaceAll(«[\n]<2,>«, » «)

15 ответов

Вам нужно установить text в результаты text.replace() :

String text = readFileAsString("textfile.txt"); text = text.replace("\n", "").replace("\r", ""); 

Это необходимо, потому что строки неизменяемы — вызов replace не изменяет исходную строку, он возвращает новую, которая была изменена. Если вы не присвоите результат text , то эта новая String будет потеряна, а мусор будет собран.

Как для получения строки новой строки для любой среды, доступной при вызове System.getProperty(«line.separator») .

+1, правильно. Что касается причины: строка неизменна . Метод replace() возвращает желаемый результат. Также смотрите документацию по API: java.sun.com/javase/6/docs/api/java/lang/… Редактировать: ах вы уже редактировали это потом 🙂

Возможно text = text.replace(«\r\n», » «).replace(«\n», » «); Лучшее решение: иначе слова будут «склеены» друг с другом (без замены одного пробела).

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

Вы также можете использовать квадратные скобки, чтобы правильно сопоставить символы новой строки для любой ОС: .replaceAll(«[\\r\\n]+», «»)

Поскольку вопрос text = text.replaceAll(«\n», «»).replaceAll(«\r», «»); замены ВСЕХ вхождений, решение скорее text = text.replaceAll(«\n», «»).replaceAll(«\r», «»);

@basZero replaceAll принимает в регулярных выражениях, replace в буквальных строках, оба заменяют все вхождения.

будьте осторожны при создании системной зависимости, это может быть тем, что вам нужно, но у меня был модульный тест со статической строкой, которая проходила на локальной машине Windows, но не выполнялась на машине сборки Continuous Integration (Linux)

Как уже отмечалось в других ответах, ваш код работает не потому, что String.replace(. ) не изменяет целевую строку. (Он не может — строки Java неизменяемы!) То, что он на самом деле делает, это создание новой String с измененными символами по мере необходимости. Но ваш код затем выбрасывает эту строку.

Вот несколько возможных решений. Какой из них наиболее правилен, зависит от того, что именно вы пытаетесь сделать.

Просто удаляет все символы новой строки. Это не справляется с завершением строк Windows или Mac.

// #2 text = text.replace(System.getProperty("line.separator"), ""); 

Удаляет все терминаторы строк для текущей платформы. Это не справляется с тем случаем, когда вы пытаетесь обработать (например) файл UNIX в Windows или наоборот.

Удаляет все терминаторы строк Windows, UNIX или Mac. Однако, если входной файл является текстом, это будет конкатенировать слова; например.

Итак, вы действительно можете это сделать:

// #4 text = text.replaceAll("\\r\\n|\\r|\\n", " "); 

который заменяет каждый ограничитель строки пробелом.

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

Использование подхода «System.getProperty (« line.seperator »)» было бы наилучшим, чтобы быть максимально независимым от системы. Отличный ответ, спасибо!

@Kingsolmn Kingsolmn — на самом деле это зависит от того, что вы подразумеваете под агностиком. Что делать, если вам нужно быть независимым от системы, которая создала файл; то есть если вы не можете предположить, что он был создан в «этой» системе?

Хорошо, я думал об использовании этого метода для замены системных разрывов строк в текстовом поле на HTML-теги
.

Как насчет text.replaceAll («\\ s +», «»); который должен заменить все вкладки, возвраты, новые строки, вертикальные вкладки и пробелы одним пробелом. + для более чем одного случая.

@webDeveloper — Это хорошее решение . другой проблемы. Вопрос ОП заключается в удалении только разрывов строк.

Начиная с Java 8 мы также можем использовать \R для представления разделителей строк (и нескольких других вещей). Также нет необходимости писать \\n или \\r в регулярных выражениях, \n и \r — это хорошо.

@Pshemo — однако вам НУЖНО написать \\R потому что \R не является допустимым escape-символом String . в любой версии Java.

Если вы хотите удалить только те строки, которые действительны для текущей ОС, вы можете сделать это:

text = text.replaceAll(System.getProperty("line.separator"), ""); 

Если вы хотите, чтобы вы удалили разделители строк, вы можете сделать это следующим образом:

Или, немного более подробный, но меньше regexy:

text = text.replaceAll("\\r", "").replaceAll("\\n", ""); 

Чтобы избежать склеивания слов (как обсуждалось в комментариях к ответу Калеба), подход к регулярным выражениям можно изменить на text.replaceAll(«(\\r|\\n)+», » «) и (предполагая, что в Java по умолчанию используется жадность? ) у вас будет решение с одним пробелом для каждой последовательности символов новой строки.

Работал отлично для меня после многого, провалился с каждой другой линией.

Линейные строки не совпадают с окнами /linux/mac. Вы должны использовать System.getProperties с атрибутом line.separator.

Это было бы эффективно, я думаю,

String s; s = "try this\n try me."; s.replaceAll("[\\r\\n]+", "") 

отредактировано для подсветки синтаксиса

String text = readFileAsString("textfile.txt").replaceAll("\n", ""); 

Несмотря на то, что определение trim() на веб-сайте oracle Msgstr «Возвращает копию строки с пропущенным пропуском ведущего и конечного пробелов.»

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

Короче говоря String text = readFileAsString(«textfile.txt»).trim(); также будет работать для вас. (Проверено с помощью Java 6)

Вы можете прочитать свой файл с помощью BufferedReader . Этот класс может разбивать входные данные на отдельные строки, которые вы можете собирать по желанию. Способ BufferedReader автоматически распознает соглашения о завершении строки в Linux, Windows и MacOS, независимо от текущей платформы.

BufferedReader br = new BufferedReader( new InputStreamReader("textfile.txt")); StringBuilder sb = new StringBuilder(); for (;;) < String line = br.readLine(); if (line == null) break; sb.append(line); sb.append(' '); // SEE BELOW >String text = sb.toString(); 

Обратите внимание, что readLine() не включает терминатор строки в возвращаемой строке. В приведенном выше коде добавляется пространство, чтобы избежать склеивания последнего слова строки и первого слова следующей строки.

Источник

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

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

6 ответов

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

String trimmedString = myString.trim(); 

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

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

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

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

ТЛ; др

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

String::strip…

Как обсуждалось здесь, 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 ) с самого начала ( ^ ) и окончание ( $ ) строки:

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 

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

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

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

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

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

function replaceNewLine(str) < return str.replace(/[\n\r]/g, ""); >
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$", "")); 

Источник

Читайте также:  Python get default encoding
Оцените статью