Mogę użyć tego:
String str = "TextX Xto modifyX";
str = str.replace('X','');//that does not work because there is no such character ''
Czy istnieje sposób na usunięcie wszystkich wystąpień znaków X
z ciągu znaków w Javie?
Próbowałem tego i nie jest to, czego chcę: str.replace('X',' '); //replace with space
Odpowiedzi:
Spróbuj użyć przeciążenia, które pobiera
CharSequence
argumenty (np.String
), Zamiastchar
:źródło
CharSequence
. docs.oracle.com/javase/7/docs/api/java/lang/…X
jest typu char?toString
. Więc twój kod wyglądałbystr = str.replace(yourChar.toString(), "");
str = str.replace("\uffff", "");
Za pomocą
będzie działać.
Wykorzystanie byłoby
str.replace("X", "");
.Wykonywanie
zwroty:
źródło
replace
przeciążenie, które wymaga prostejCharSequence
.Jeśli chcesz coś zrobić z Java Strings, Commons Lang StringUtils to świetne miejsce do oglądania.
źródło
replace
.To jest przykład, w którym usunąłem znak - z Ciągu.
źródło
Lubię używać RegEx przy tej okazji:
gdzie g oznacza globalny, więc przejdzie przez cały ciąg i zastąpi wszystkie X znakiem „”; jeśli chcesz zamienić zarówno X, jak i X, po prostu powiesz:
(patrz moje skrzypce tutaj: skrzypce )
źródło
Witaj Wypróbuj ten kod poniżej
źródło
Użyj replaceAll zamiast replace
To powinno dać ci pożądaną odpowiedź.
źródło
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher( this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
źródło
input = "deletes all blanks too";
daje „deletesalllankstoo”tutaj jest funkcja lambda, która usuwa wszystkie znaki przekazywane jako ciąg znaków
String str = "TextX XYto modifyZ";
deleteChars.apply( str, "XYZ" ); // –> "Text to modify"
To rozwiązanie bierze pod uwagę, że wynikowy Ciąg - w przeciwieństwie do
replace()
- nigdy nie staje się większy niż Ciąg początkowy podczas usuwania znaków. Dzięki temu unika się wielokrotnego przydzielania i kopiowania, jednocześnie dodając znaki do znakuStringBuilder
asreplace()
.Nie wspominając już o bezcelowym generowaniu
Pattern
iMatcher
wystąpieniachreplace()
, które nigdy nie są potrzebne do usunięcia.W odróżnieniu od
replace()
tego rozwiązania można usunąć kilka znaków za jednym zamachem.źródło
str.replace("…", "")
private Pattern(…)
tworzy wystąpienia, a następnie generowane wywołania wzorcapublic String replaceAll(String repl)
. Tak więc miały miejsce następujące wywołania funkcji:return Pattern.compile(target.toString(), Pattern.LITERAL).matcher( this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
- patrz komentarz Sal_Vader_808. W sumie około 3 razy dłużej niż w moim rozwiązaniu hip- lambda. I tutaj jest dobrze wyjaśnione, dlaczego moje hip- lambda jest również szybsze: Dlaczego Java :: String :: replace () jest tak wolny?Ocena głównych odpowiedzi za pomocą wskaźnika wydajności, który potwierdza obawy, że obecnie wybrana odpowiedź powoduje, że kosztowne operacje wyrażenia regularnego są pod maską
Do tej pory dostarczone odpowiedzi są dostępne w 3 głównych stylach (ignorując odpowiedź JavaScript;)):
Jeśli chodzi o rozmiar kodu, String.replace jest najbardziej zwięzły. Prosta implementacja Java jest nieco mniejsza i czystsza (IMHO) niż Lambda (nie zrozum mnie źle - często używam Lambdas tam, gdzie są odpowiednie)
Szybkość wykonywania była w kolejności od najszybszej do najwolniejszej: prosta implementacja Java, Lambda, a następnie String.replace () (która wywołuje wyrażenie regularne).
Zdecydowanie najszybszą implementacją była dostrojona prosta implementacja Java, która wstępnie przypisuje bufor StringBuilder do maksymalnej możliwej długości wyniku, a następnie po prostu dołącza znaki do bufora, które nie znajdują się w ciągu „znaków do usunięcia”. Pozwala to uniknąć wszelkich realokacji, które wystąpiłyby dla ciągów o długości> 16 znaków (domyślny przydział dla StringBuilder) i uniknięto trafienia wydajnościowego „przesuń w lewo” usuwania znaków z kopii ciągu znaków, który jest implementacją Lambda.
Poniższy kod uruchamia prosty test porównawczy, uruchamiając każdą implementację 1 000 000 razy i rejestruje upływ czasu.
Dokładne wyniki różnią się przy każdym uruchomieniu, ale kolejność wydajności nigdy się nie zmienia:
Implementacja Lambda (skopiowana z odpowiedzi Kaplana) może być wolniejsza, ponieważ wykonuje „przesunięcie w lewo o jeden” spośród wszystkich znaków na prawo od usuwanej postaci. Oczywiście pogorszy się to w przypadku dłuższych ciągów znaków z dużą ilością znaków wymagających usunięcia. Również w samej implementacji Lambda mogą występować pewne koszty ogólne.
Implementacja String.replace używa wyrażenia regularnego i wykonuje „kompilację” wyrażenia regularnego przy każdym wywołaniu. Optymalizacja tego polega na bezpośrednim użyciu wyrażenia regularnego i buforowaniu skompilowanego wzorca, aby uniknąć kosztu kompilacji za każdym razem.
źródło
fromString.replace("X", "").replace("Y", "").replace("Z", "");
byłoby potrzebne. Teraz otrzymujemy właściwy czas: Rozpocznij prosty Czas: 759 | Rozpocznij lambda Czas: 1092 | Rozpocznij usuwanieCharsLambda () Czas: 1420 | Rozpocznij zastępowanie poprawione Czas: 4636Podczas wymiany musisz umieścić znaki w nawiasach kwadratowych. Przykładowy kod będzie następujący:
źródło
Możesz używać,
str = str.replace("X", "");
jak wspomniano wcześniej, i wszystko będzie dobrze. Twoja informacja''
nie jest pustym (lub prawidłowym) znakiem, ale'\0'
jest.Więc możesz użyć
str = str.replace('X', '\0');
zamiast tego.źródło