Jak usunąć zduplikowane spacje w ciągu za pomocą języka Java?


147

Jak usunąć zduplikowane spacje (w tym tabulatory, znaki nowej linii, spacje itp.) W ciągu znaków za pomocą języka Java?

Odpowiedzi:


378

Lubię to:

yourString = yourString.replaceAll("\\s+", " ");

Na przykład

System.out.println("lorem  ipsum   dolor \n sit.".replaceAll("\\s+", " "));

wyjścia

lorem ipsum dolor sit.

Co to \s+oznacza?

\s+jest wyrażeniem regularnym. \sdopasowuje spację, tabulator, nową linię, powrót karetki, wysuw strony lub tabulator pionowy i +mówi „jeden lub więcej z nich”. W ten sposób powyższy kod zwinie wszystkie „białe podciągi” dłuższe niż jeden znak, z pojedynczym znakiem spacji.


Źródło: Java: usuwanie zduplikowanych odstępów w ciągach


3
@SuhrobSamiev - String.replaceAll () jest w Javie od JDK 1.4. docs.oracle.com/javase/1.4.2/docs/api/java/lang/… , java.lang.String)
David Moles,

3
Chciałbym móc dodać więcej niż +1, aby uzyskać niesamowite wyjaśnienie funkcji \ s +.
Cyntech

Zrozumiałem, \s+ale co oznacza 2 lewy ukośnik \\?
saplingPro

2
Literał ciągu "\\"reprezentuje ciąg składający się z pojedynczego ukośnika odwrotnego. Aby reprezentować \s+, piszesz "\\s+".
aioobe

1
Czy to usunie znak powrotu karetki? czy musiałbym osobno usunąć „\\ r”? Dzięki!
user3388884

24

Możesz użyć wyrażenia regularnego

(\s)\1

i

zamień na $1.

Kod Java:

str = str.replaceAll("(\\s)\\1","$1");

Jeśli wejście to "foo\t\tbar ", otrzymasz "foo\tbar "jako wyjście,
ale jeśli wejście jest "foo\t bar", pozostanie niezmienione, ponieważ nie ma żadnych kolejnych białych znaków.

Jeśli potraktujesz wszystkie białe znaki (spacja, tabulator pionowy, tabulator poziomy, powrót karetki, wysuw strony, nowa linia) jako spację, możesz użyć następującego wyrażenia regularnego, aby zastąpić dowolną liczbę kolejnych białych znaków pojedynczą spacją:

str = str.replaceAll("\\s+"," ");

Ale jeśli chcesz zamienić dwie kolejne białe spacje na jedną spację, powinieneś zrobić:

str = str.replaceAll("\\s{2}"," ");

9

Spróbuj tego - musisz import java.util.regex.*;

    Pattern pattern = Pattern.compile("\\s+");
    Matcher matcher = pattern.matcher(string);
    boolean check = matcher.find();
    String str = matcher.replaceAll(" ");

Gdzie stringjest twój ciąg, na którym musisz usunąć zduplikowane białe spacje


9

cześć najszybszy (ale nie najpiękniejszy sposób), jaki znalazłem, to

while (cleantext.indexOf("  ") != -1)
  cleantext = StringUtils.replace(cleantext, "  ", " ");

to działa dość szybko na Androidzie w przeciwieństwie do wyrażenia regularnego


1
Działa tylko dla spacji, ale nie dla innych białych znaków, takich jak tabulatory i znaki nowej linii.
Pang

1
Wiem, że musisz dodać więcej pętli while dla innych podmiotów. Ale ten kod działa znacznie szybciej na Androidzie, ponieważ te wyrażenia regularne, musiałem przetwarzać całe ebooki.
wutzebaer

Ogromnie szybszy również na komputerze stacjonarnym. Nie testowałem go pod kątem dużego ciągu, ale jeśli planujesz uruchomić go na wielu małych ciągach, to jest odpowiedź, której szukasz.
Ivelate

9
String str = "   Text    with    multiple    spaces    ";
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"

6

Chociaż jest już za późno, znalazłem lepsze rozwiązanie (które mi pasuje), które zastąpi wszystkie kolejne białe spacje tego samego typu jedną białą spacją tego samego typu. To jest:

   Hello!\n\n\nMy    World  

będzie

 Hello!\nMy World 

Zauważ, że nadal istnieją początkowe i końcowe białe spacje. Więc moje kompletne rozwiązanie to:

str = str.trim().replaceAll("(\\s)+", "$1"));

W tym przypadku trim()zastępuje wszystkie początkowe i końcowe białe znaki znakiem „”. (\\s)służy do przechwytywania \\s(czyli białych spacji, takich jak „”, „\ n”, „\ t”) w grupie nr 1 . +znak służy do dopasowania 1 lub więcej poprzedzających tokenów. A więc (\\s)+mogą to być kolejne znaki (1 lub więcej) wśród pojedynczych białych znaków („”, „\ n” lub „\ t”). $1służy do zastąpienia pasujących ciągów ciągiem z grupy nr 1 (który zawiera tylko 1 znak odstępu) pasującego typu (to jest pojedynczego znaku odstępu, który został dopasowany). Powyższe rozwiązanie zmieni się następująco:

   Hello!\n\n\nMy    World  

będzie

Hello!\nMy World

Nie znalazłem tutaj powyższego rozwiązania, więc je opublikowałem.


0

Jeśli chcesz pozbyć się wszystkich początkowych i końcowych, zbędnych białych znaków, powinieneś zrobić coś takiego:

// \\A = Start of input boundary
// \\z = End of input boundary 
string = string.replaceAll("\\A\\s+(.*?)\\s+\\z", "$1");

Następnie możesz usunąć duplikaty, korzystając z innych strategii wymienionych tutaj:

string = string.replaceAll("\\s+"," ");

0

Możesz także spróbować użyć String Tokeniser dla dowolnej spacji, tabulacji, nowej linii i wszystkich. Prosty sposób to

String s = "Your Text Here";        
StringTokenizer st = new StringTokenizer( s, " " );
while(st.hasMoreTokens())
{
    System.out.print(st.nextToken());
}

-10

Można to zrobić w trzech krokach:

  1. Konwertuj ciąg na tablicę znaków (ToCharArray)
  2. Wystąp o pętlę na tablicy charater
  3. Następnie zastosuj funkcję zamiany ciągu (Replace ("żądło, które chcesz zamienić", "oryginalny ciąg"));

1
To nie jest dobre rozwiązanie, upuszczenie do tablicy znaków niczego nie rozwiązuje. W rzeczywistości nie wyjaśniasz, jak wykonać wymianę, która jest sednem problemu. Prosimy również nie publikować zupełnie niepowiązanych linków. Jeśli to zrobisz, zostaniesz oznaczony jako spamer.
Mat
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.