Jak usunąć znaki nowej linii z początku i końca ciągu?

129

Mam ciąg zawierający tekst, po którym następuje pusty wiersz. Jaki jest najlepszy sposób, aby zachować część z tekstem, ale usunąć znak nowej linii z białych znaków na końcu?

Confiqure
źródło
1
Nie, nie jest. Pytanie w linku dotyczy raczej „wymiany”…
Faiz

Odpowiedzi:

277

Użyj String.trim()metody, aby pozbyć się białych znaków (spacji, nowych linii itp.) Z początku i końca ciągu.

String trimmedString = myString.trim();
Crozin
źródło
18
Pytanie dotyczy nowych linii. To usuwa więcej niż tylko znaki nowej linii
mmm
21
String.replaceAll("[\n\r]", "");
John B.
źródło
14
Bracie, @JohnB To usunie również cały nowy znak linii między ciągiem. prośba polega na usunięciu tylko początkowego i końcowego znaku nowej linii.
siddhartha,
5

tl; dr

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

String::strip…

Stara String::trimmetoda ma dziwną definicję z białymi znakami .

Jak omówiono tutaj , Java 11 dodaje nowe strip…metody do Stringklasy. Używają one definicji białych znaków bardziej znanej z Unicode. Zobacz zasady tej definicji w klasie JavaDoc dla Character::isWhitespace.

Przykładowy kod.

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

Możesz też usunąć tylko początkową lub końcową spację.

Nie wspominasz dokładnie, które punkty kodowe tworzą twoje nowe linie. Wyobrażam sobie, że twoja nowa linia prawdopodobnie znajduje się na tej liście punktów kodowych, na które kieruje się strip:

  • Jest to znak spacji Unicode (SPACE_SEPARATOR, LINE_SEPARATOR lub PARAGRAPH_SEPARATOR), ale nie jest również nierozdzielającą spacją („\ u00A0”, „\ u2007”, „\ u202F”).
  • To jest '\ t', U + 0009 TABULACJA POZIOMA.
  • To jest '\ n', U + 000A LINE FEED.
  • To jest '\ u000B', U + 000B TABULACJA PIONOWA.
  • To jest '\ f', U + 000C FORM FEED.
  • To jest '\ r', U + 000D CARRIAGE RETURN.
  • Jest to „\ u001C”, SEPARATOR PLIKÓW U + 001C.
  • Jest to „\ u001D”, U + 001D SEPARATOR GRUP.
  • Jest to „\ u001E”, U + 001E SEPARATOR REKORDÓW.
  • To jest „\ u001F”, U + 0
Basil Bourque
źródło
4

Ten kod Java robi dokładnie to, co jest zadane w tytule pytania, czyli „usuwa znaki nowej linii z początku i końca łańcucha java”:

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

Usuń znaki nowej linii tylko z końca linii:

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

Usuń znaki nowej linii tylko z początku linii:

String.replaceAll("^[\n\r]", "")
Alexander Samoylov
źródło
Czy mógłbyś podać dodatkowy kontekst swojej odpowiedzi? W ten sposób każdy może zrozumieć, co robi Twój kod i dlaczego.
Mariano Zorrilla
Dodałem wyjaśnienia do mojej odpowiedzi. Mam nadzieję, że teraz jest jasne.
Alexander Samoylov
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. Początek łańcucha = ^,
  2. Koniec łańcucha = $,
  3. kombinacja wyrażeń regularnych = | ,
  4. Łamanie linii = \ r \ n | [\ n \ x0B \ x0C \ r \ u0085 \ u2028 \ u2029]
hmmh
źródło
0

Dodam też odpowiedź na to pytanie, ponieważ chociaż miałem to samo pytanie, udzielona odpowiedź nie wystarczyła. Po pewnym przemyśleniu zdałem sobie sprawę, że można to bardzo łatwo zrobić za pomocą wyrażenia regularnego.

Aby usunąć znaki nowej linii od początku:

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

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

i koniec łańcucha:

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

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

Jestem pewien, że nie jest to najbardziej wydajny sposób przycinania sznurka. Ale wydaje się, że jest to najczystszy i najprostszy sposób na wprowadzenie takiej operacji.

Zauważ, że tę samą metodę można zrobić, aby przyciąć dowolną odmianę i kombinację znaków z dowolnego końca, ponieważ jest to proste wyrażenie regularne.

Zhro
źródło
Tak, ale co jeśli nie wiesz, ile wierszy jest na początku / na końcu? Twoje rozwiązanie zakłada, że ​​w obu przypadkach są dokładnie 2 nowe linie
Luka Govedič.
Drugi parametr split()to tylko limit. Zostaw to, jeśli chcesz dopasować nieograniczoną liczbę razy.
Zhro,
0

Spróbuj tego

function replaceNewLine(str) { 
  return str.replace(/[\n\r]/g, "");
}
Jobelle
źródło
0

Jeśli chcesz usunąć tylko podziały wierszy (nie spacje, tabulatory) na początku i na końcu ciągu (nie pomiędzy), możesz zastosować następujące podejście:

Użyj wyrażeń regularnych, aby usunąć znaki powrotu karetki ( \\r) i znaki nowej linii ( \\n) z początku ( ^) i końca ( $) ciągu:

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

Kompletny przykład:

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

Wyprowadza:

before: >
Hello
World
<
after: >Hello
World<
slartidan
źródło
-3
String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");
Chan
źródło
2
To nie jest właściwą odpowiedzią na pytanie. Usuwa wszystkie CR i LF, nie tylko te na początku i na końcu.
james.garriss
To zastąpi wszystko, nie tylko od początku i końca.
Hamzeh Soboh