Odpowiedzi:
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. \s
dopasowuje 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.
\s+
ale co oznacza 2 lewy ukośnik \\?
"\\"
reprezentuje ciąg składający się z pojedynczego ukośnika odwrotnego. Aby reprezentować \s+
, piszesz "\\s+"
.
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}"," ");
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 string
jest twój ciąg, na którym musisz usunąć zduplikowane białe spacje
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
String str = " Text with multiple spaces ";
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"
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”). $1
sł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.
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+"," ");
Można to zrobić w trzech krokach: