Jaka jest różnica między java.lang.String replace()
i replaceAll()
metodami, inne niż później używa wyrażenia regularnego? W przypadku prostych podstawień podobnych, zastępujących .
ze /
jest jakaś różnica?
221
W java.lang.String
The replace
metoda albo trwa parę char lub parę CharSequence
„s (z których String jest podklasą, więc ona szczęśliwie wziąć parę struny). replace
Metoda zastąpi wszystkie wystąpienia char lub CharSequence
. Z drugiej strony oba String
argumenty do replaceFirst
i replaceAll
są wyrażeniami regularnymi (regex). Korzystanie z niewłaściwej funkcji może prowadzić do subtelnych błędów.
str.replaceAll(regex, repl)
jest takie samo jakPattern.compile(regex).matcher(str).replaceAll(repl)
. Jest więc duży narzut w zależności od tego, ile zużywa się.String#replace(target, replacement)
robi to samo, tyle że cytuje ciągi znaków:Pattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
czy istnieje jakiś powód, dla któregoString#replace
byłoby szybsze niżString#replaceAll
? Nie wyglądałoby na to, ponieważString#replace
po prostu wykonuje dodatkowe operacje.replaceAll
. Odpowiedź brzmi bardziejreplace
P: Jaka jest różnica między
java.lang.String
metodamireplace()
ireplaceAll()
, poza tym, że później używa wyrażenia regularnego.Odp .: Po prostu regex. Oboje zastępują wszystko :)
http://docs.oracle.com/javase/6/docs/api/java/lang/String.html
PS:
Jest też
replaceFirst()
(który wymaga wyrażenia regularnego)źródło
CharSequence
jest. Zarównoreplace()
ireplaceAll()
„praca zCharSequence
”. Jest tak, żereplaceAll()
traktuje podaneCharSequence
wyrażenie jako wyrażenie regularne, więc szuka dopasowań wyrażenia regularnego , podczas gdyreplace()
uważa podaneCharSequence
jako zwykły tekst wyszukiwania, więc szuka jego wystąpienia .Zarówno
replace()
ireplaceAll()
zamień wszystkie wystąpienia w ciągu.Przykłady
Zawsze znajduję przykłady pomocne w zrozumieniu różnic.
replace()
Użyj,
replace()
jeśli chcesz po prostu zamienić niektóre nachar
innechar
lub niektóre naString
inneString
(faktycznieCharSequence
).Przykład 1
Zastąpić wszystkie wystąpienia znaku
x
zo
.Przykład 2
Zastąpić wszystkie wystąpienia napisu
fish
zsheep
.replaceAll()
Użyj,
replaceAll()
jeśli chcesz użyć wzorca wyrażenia regularnego .Przykład 3
Zamień dowolny numer na
x
.Przykład 4
Usuń wszystkie białe znaki.
Zobacz też
Dokumentacja
replace(char oldChar, char newChar)
replace(CharSequence target, CharSequence replacement)
replaceAll(String regex, String replacement)
replaceFirst(String regex, String replacement)
Wyrażenia regularne
źródło
replace()
Metoda jest przeciążony do zaakceptowania zarówno prymitywnechar
iCharSequence
jako argumenty.Jeśli chodzi o wydajność,
replace()
metoda jest nieco szybsza niżreplaceAll()
dlatego, że ta ostatnia najpierw kompiluje wzorzec wyrażenia regularnego, a następnie dopasowuje przed ostatecznym zastąpieniem, podczas gdy pierwsza po prostu dopasowuje podany argument i zamienia.Ponieważ wiemy, że dopasowanie regex wzorzec jest nieco bardziej skomplikowana, a co za tym idzie wolniej, a preferowanie
replace()
ponadreplaceAll()
sugeruje w miarę możliwości.Na przykład w przypadku prostych zamian, takich jak wspomniane, lepiej użyć:
zamiast:
Uwaga: powyższe argumenty metody konwersji zależą od systemu.
źródło
Pattern.compile(...)
treści / części w swoich implementacjach, wydaje się, żereplace
jest mniej skomplikowane w zakresie definiowania / wysyłania pierwszego argumentu. To nie wymaga"\"
. Ponadtoreplace
jest dostępny od Java1.5
ireplaceAll
od1.4
Zwraca nowy ciąg wynikający z zamiany wszystkich wystąpień oldChar w tym ciągu na newChar.
Zastępuje każdy podciąg tego łańcucha, który pasuje do podanego wyrażenia regularnego z podanym zamiennikiem.
źródło
Nie jest prawdą, że replace () działa szybciej niż replaceAll (), ponieważ oba wykorzystują ten sam kod w swojej implementacji
Pattern.compile (regex) .matcher (this) .replaceAll (replace);
Teraz pytanie brzmi: kiedy użyć replace i kiedy użyć replaceAll (). Jeśli chcesz zastąpić podciąg innym podciągiem, niezależnie od miejsca jego wystąpienia w ciągu, użyj replace (). Ale jeśli masz jakieś szczególne preferencje lub warunki, takie jak zamień tylko te podciągi na początku lub na końcu łańcucha, użyj replaceAll (). Oto kilka przykładów, które mogą potwierdzić mój punkt widzenia:
źródło
replace
nie dzwoniPattern.compile(regex).matcher(this).replaceAll(replacement);
. WzywaPattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
Jak wspomniano w odpowiedzi wickeD, z replaceAll ciąg zastępujący jest traktowany inaczej w zastępstwie i replaceAll. Oczekiwałem, że [3] i [4] będą miały tę samą wartość, ale są różne.
Wynikiem tego jest:
Różni się to od perla, w którym zamiana nie wymaga dodatkowego poziomu ucieczki:
który drukuje \ X 2
Może to być dość uciążliwe, jak przy próbie użycia wartości zwracanej przez java.sql.DatabaseMetaData.getSearchStringEscape () z replaceAll ().
źródło
Stary wątek Wiem, ale jestem trochę nowy w Javie i odkryłem jedną z dziwnych rzeczy. Użyłem,
String.replaceAll()
ale otrzymuję nieprzewidywalne wyniki.Coś w stylu bałaganu:
Więc zaprojektowałem tę funkcję, aby obejść ten dziwny problem:
Które sprawiają, że możesz zrobić:
źródło
String.replaceAll()
oczekuje wyrażeń regularnych, a nie dosłownych argumentów, dlatego otrzymujesz wyniki „nieprzewidywalne” (które są naprawdę bardzo przewidywalne).String.replace()
działa tak, jak chcesz.Aby dodać do już wybranej „najlepszej odpowiedzi” (i innych, które są tak samo dobre jak Suragch),
String.replace()
ogranicza się zastępowanie znaków, które są sekwencyjne (w ten sposób przyjmującCharSequence
). NieString.replaceAll()
jest jednak ograniczany przez zamianę tylko znaków sekwencyjnych. Można zastąpić znaki niesekwencyjne, o ile wyrażenie regularne jest zbudowane w taki sposób.Również (co najważniejsze i boleśnie oczywiste)
replace()
może jedynie zastąpić wartości dosłowne; podczas gdyreplaceAll
może zastąpić sekwencje „podobne” (niekoniecznie identyczne).źródło
replace()
metoda nie używa wzorca wyrażenia regularnego, podczas gdyreplaceAll()
metoda używa wzorca wyrażenia regularnego. Więcreplace()
działa szybciej niżreplaceAll()
.źródło
replace działa na typie danych char, ale replaceAll działa na typie danych String i oba zastępują wszystkie wystąpienia pierwszego argumentu drugim argumentem.
źródło