Як видалити нові рядки з початку та кінця рядка?


129

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



1
Ні це не так. Питання в посиланні задається питанням про «заміну», а не ..
Faiz

Відповіді:


277

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

String trimmedString = myString.trim();

18
Питання про нові рядки. Це видаляє більше, ніж просто нові рядки
ммм

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

14
Bro, @JohnB Також буде видалено всі нові символи рядка між рядками. запит полягає в тому, щоб видалити лише новий провідний символ.
siddhartha

5

тл; д-р

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 + 000A ЛІНЕВАННЯ.
  • Це "\ u000B", U + 000B ВЕРТИКАЛЬНА ТАБЛЮЦІЯ.
  • Це "\ f", U + 000C ФОРМУВАННЯ ФОРМУ.
  • Це "\ r", U + 000D ПОВЕРНЕННЯ ТРАНСПОРТУ.
  • Це "\ u001C", U + 001C СЕПАРАТОР ФАЙЛУ.
  • Це '\ u001D', U + 001D СЕПАРАТОР ГРУПИ.
  • Це "\ u001E", U + 001E СЕПАРАТОР ЗАПИСІВ.
  • Це "\ u001F", U + 0

4

Цей код Java виконує саме те, що задається в заголовку питання, тобто "видалити нові рядки з початку та кінця string-java":

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

Видаліть нові рядки лише з кінця рядка:

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

Видаліть нові рядки лише з початку рядка:

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

Чи можете ви надати додатковий контекст для своєї відповіді? Таким чином кожен може зрозуміти, що робить ваш код і чому.
Mariano Zorrilla

Я додав пояснення до своєї відповіді. Я сподіваюся, що зараз це зрозуміло.
Олександр Самойлов


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. Linebreak = \ r \ n | [\ n \ x0B \ x0C \ r \ u0085 \ u2028 \ u2029]

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

Я впевнений, що це не найефективніший спосіб обрізки струни. Але, здається, це найчистіший і найпростіший спосіб ввести таку операцію.

Зауважте, що той самий метод можна зробити для обрізки будь-яких варіацій та комбінацій символів з будь-якого кінця, оскільки це простий регулярний вираз.


Так, але що, якщо ви не знаєте, скільки рядків на початку / в кінці? Ваше рішення передбачає, що в обох випадках є рівно 2 нові рядки
Лука Говедіч

Другий параметр - split()це лише межа. Залиште це, якщо ви хочете відповідати необмежену кількість разів.
Жро


0

Якщо ви хочете видалити лише розриви рядків (не пробіли, вкладки) на початку та в кінці рядка (не між ними), тоді ви можете скористатися таким підходом:

Використовуйте регулярні вирази, щоб видалити повернення каретки ( \\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<

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

2
Це неправильно відповідає на запитання. Він видаляє всі CR та LF, не лише ті, що починаються та в кінці.
james.garriss

Це замінить усіх, не тільки від початку та до кінця.
Hamzeh Soboh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.