2010-10-18 18 views

Odpowiedz

354

Jak 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. \s dopasowuje spację, tabulację, nową linię, powrót karetki, posuw formularza lub kartę pionową, a + mówi "jeden lub więcej z nich". Tak więc powyższy kod zwinie wszystkie "białe znaki" dłuższe niż jeden znak, z pojedynczym znakiem spacji.


Źródło: Java: Removing duplicate white spaces in strings

+0

dlaczego nie ma metody replaceAll ?? Czy najnowszy JDK obsługuje tę metodę? –

+2

@SuhrobSamiev - String.replaceAll() jest w języku Java od JDK 1.4. http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#replaceAll(java.lang.String, java.lang.String) –

+3

Chciałbym móc dodać więcej niż +1 za niesamowite wyjaśnienie \ s +. – Cyntech

9

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

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

Gdzie string ma swój ciąg, w którym trzeba usunąć duplikaty spacji

23

Można użyć wyrażenia regularnego

(\s)\1 

i

zastąpienia go $1.

kod Java:

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

Jeśli wejście jest "foo\t\tbar " dostaniesz "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 traktować wszystkie białe znaki (spacja, tabulacja pionowa, zakładka poziome, powrót karetki, forma paszowych, nowa linia) jako przestrzeni następnie można użyć następującego wyrażenia regularnego zastąpić dowolny liczba kolejnych białej przestrzeni z pojedynczy przestrzeń:

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

Ale jeśli chcesz zastąpić dwóch kolejnych spacji z pojedynczym odstępem należy zrobić:

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

To może być możliwe w trzech etapach:

  1. przekonwertować ciąg do tablicy znaków (ToCharArray)
  2. Zastosuj do pętli na tablicy Charater
  3. Następnie nałożyć ciąg funkcji Replace (Wymień ("żądło chcesz zastąpić", "oryginalny łańcuch"));
+1

To nie jest dobre rozwiązanie, przejście do tablicy znaków nie rozwiązuje niczego. W rzeczywistości nie wyjaśniasz, jak dokonać wymiany, co stanowi sedno problemu. Proszę również ** nie ** publikuj całkowicie niepowiązanych linków. Jeśli to zrobisz, zostaniesz oznaczony jako spamer. – Mat

0

Jeśli chcesz pozbyć się wszystkich początkowe i końcowe obcego spacji a chcesz zrobić coś takiego:

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

Następnie można usunąć duplikaty stosując inne strategie wymienione tutaj:

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

hi najszybciej (ale nie najładniejszy sposób) znalazłem to

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

to działa dość szybko na Androidzie w przeciwieństwie do regex

+1

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

+1

Wiem, musisz dodać więcej tych, podczas gdy pętle dla innych podmiotów. Ale ten kod działa znacznie szybciej na Androida, ponieważ te regex, musiałem przetwarzać kompletne książki elektroniczne. – wutzebaer

+0

Ogromnie szybsze na komputerze. Nie testowałem go na duży ciąg, ale jeśli planujesz uruchomić go na wielu małych ciągach, jest to odpowiedź, której szukasz. – Ivelate

5

Chociaż jest za późno, znalazłem lepsze rozwiązanie (które działa dla mnie), które zastąpi wszystkie kolejne białe przestrzenie tego samego typu z jedną białą przestrzenią jego typ. Czyli:

Hello!\n\n\nMy World 

będzie

Hello!\nMy World 

Wskazówki Są nadal wiodące i końcowe białe znaki. Więc moja kompletnym rozwiązaniem jest:

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

Tutaj trim() zastępuje wszystkie początkowe i końcowe białe strun kosmicznych z „”. (\\s) służy do przechwytywania \\s (czyli białych spacji, takich jak ",", \ n "," \ t ") w grupie grupy nr 1. + znak służy do porównywania 1 lub więcej poprzedzających tokenów. Tak więc (\\s)+ może składać się z kolejnych znaków (1 lub więcej) spośród pojedynczych znaków spacji ('', '\ n' lub '\ t'). $1 służy do zamiany pasujących ciągów na ciąg znaków grupy # 1 (który zawiera tylko 1 znak odstępu) odpowiadającego typu (czyli pojedynczego spacji, który został dopasowany). Powyższe rozwiązanie zmieni tak:

Hello!\n\n\nMy World 

będzie

Hello!\nMy World 

nie znalazłem mój powyższy roztwór tu więc napisali go.

0

Możesz również spróbować użyć Tokeniatora sznurka, dla dowolnej spacji, tabulatora, nowej linii i wszystkich. Prostym sposobem jest

String s = "Your Text Here";   
StringTokenizer st = new StringTokenizer(s, " "); 
while(st.hasMoreTokens()) 
{ 
    System.out.print(st.nextToken()); 
} 
8
String str = " Text with multiple spaces "; 
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str); 
// str = "Text with multiple spaces" 
Powiązane problemy