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


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();

18
Pytanie dotyczy nowych linii. To usuwa więcej niż tylko znaki nowej linii
mmm

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

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

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]", "")

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]

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.


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

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<

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.