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?
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?
Odpowiedzi:
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();
String.replaceAll("[\n\r]", "");
String cleanString = dirtyString.strip() ; // Call new `String::string` method.
String::strip…
Stara String::trim
metoda ma dziwną definicję z białymi znakami .
Jak omówiono tutaj , Java 11 dodaje nowe strip…
metody do String
klasy. 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
:
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]", "")
Jeśli twój ciąg jest potencjalnie null
, rozważ użycie StringUtils.trim()
- wersji z bezpieczną wartością null String.trim()
.
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])$", "") + "]");
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.
split()
to tylko limit. Zostaw to, jeśli chcesz dopasować nieograniczoną liczbę razy.
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<
String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");