Apa perbedaan antara java.lang.String replace()
danreplaceAll()
metode, selain menggunakan regex nanti? Untuk penggantian sederhana seperti, ganti .
dengan /
, apakah ada perbedaan?
221
Dalam java.lang.String
, replace
metode baik mengambil sepasang char atau sepasang CharSequence
(yang String adalah subclass, sehingga dengan senang hati akan mengambil sepasang String). The replace
Metode akan mengganti semua kejadian dari char atau CharSequence
. Di sisi lain, keduanya String
argumen untuk replaceFirst
dan replaceAll
merupakan ekspresi reguler (regex). Menggunakan fungsi yang salah dapat menyebabkan bug halus.
str.replaceAll(regex, repl)
sama denganPattern.compile(regex).matcher(str).replaceAll(repl)
. Jadi ada overhead yang besar tergantung pada seberapa banyak digunakan.String#replace(target, replacement)
melakukan hal yang sama, kecuali mengutip string:Pattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
Apakah ada beberapa alasan mengapaString#replace
akan lebih cepat daripadaString#replaceAll
? Tampaknya tidak seperti itu karenaString#replace
hanya melakukan operasi tambahan.replaceAll
. Jawabannya lebih lanjut tentangreplace
T: Apa perbedaan antara
java.lang.String
metodereplace()
danreplaceAll()
, selain itu nanti menggunakan regex.A: Hanya regex. Mereka berdua mengganti semua :)
http://docs.oracle.com/javase/6/docs/api/java/lang/String.html
PS:
Ada juga
replaceFirst()
(yang membutuhkan regex)sumber
CharSequence
adalah. Keduanyareplace()
danreplaceAll()
"bekerja denganCharSequence
". Itu yangreplaceAll()
menganggap diberikanCharSequence
sebagai ekspresi reguler sehingga mencari kecocokan regex , sementarareplace()
menganggap diberikanCharSequence
sebagai teks pencarian biasa sehingga mencari kemunculannya .Keduanya
replace()
danreplaceAll()
ganti semua kemunculan dalam String.Contohnya
Saya selalu menemukan contoh yang membantu untuk memahami perbedaan.
replace()
Gunakan
replace()
jika Anda hanya ingin mengganti beberapachar
dengan yang lainchar
atau beberapaString
dengan yang lainString
(sebenarnyaCharSequence
).Contoh 1
Ganti semua kemunculan karakter
x
dengano
.Contoh 2
Ganti semua kemunculan string
fish
dengansheep
.replaceAll()
Gunakan
replaceAll()
jika Anda ingin menggunakan pola ekspresi reguler .Contoh 3
Ganti nomor apa pun dengan
x
.Contoh 4
Hapus semua spasi putih.
Lihat juga
Dokumentasi
replace(char oldChar, char newChar)
replace(CharSequence target, CharSequence replacement)
replaceAll(String regex, String replacement)
replaceFirst(String regex, String replacement)
Ekspresi Reguler
sumber
The
replace()
metode kelebihan beban untuk menerima baik primitifchar
danCharSequence
sebagai argumen.Sejauh menyangkut kinerja,
replace()
metode ini sedikit lebih cepat daripadareplaceAll()
karena yang terakhir pertama mengkompilasi pola regex dan kemudian cocok sebelum akhirnya diganti sedangkan yang pertama hanya cocok untuk argumen yang diberikan dan diganti.Karena kita tahu pencocokan pola regex sedikit lebih kompleks dan akibatnya lebih lambat, kemudian lebih memilih
replace()
lebihreplaceAll()
disarankan bila memungkinkan.Misalnya, untuk penggantian sederhana seperti yang Anda sebutkan, lebih baik menggunakan:
dari pada:
Catatan: argumen metode konversi di atas bergantung pada sistem.
sumber
Pattern.compile(...)
konten / bagian dalam implementasinya, tampaknyareplace
kurang kompleks tentang cara mendefinisikan / mengirim argumen pertama. Itu tidak membutuhkan"\"
. Selanjutnyareplace
tersedia sejak Jawa1.5
danreplaceAll
sejak1.4
Mengembalikan string baru yang dihasilkan dari mengganti semua kemunculan oldChar di string ini dengan newChar.
Ganti setiap substring dari string ini yang cocok dengan ekspresi reguler yang diberikan dengan penggantian yang diberikan.
sumber
Tidak benar bahwa replace () bekerja lebih cepat daripada replaceAll () karena keduanya menggunakan kode yang sama dalam implementasinya
Pattern.compile (regex) .matcher (ini) .replaceAll (pengganti);
Sekarang pertanyaannya adalah kapan harus menggunakan replace dan kapan harus menggunakan replaceAll (). Ketika Anda ingin mengganti substring dengan substring lain terlepas dari tempatnya di string gunakan replace (). Tetapi jika Anda memiliki beberapa preferensi atau kondisi tertentu seperti hanya mengganti substring tersebut di awal atau akhir string, gunakan replaceAll (). Berikut ini beberapa contoh untuk membuktikan pendapat saya:
sumber
replace
tidak meneleponPattern.compile(regex).matcher(this).replaceAll(replacement);
. PanggilannyaPattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
Seperti disinggung dalam jawaban wickeD, dengan replaceAll string pengganti ditangani secara berbeda antara replace dan replaceAll. Saya mengharapkan [3] dan [4] memiliki nilai yang sama, tetapi mereka berbeda.
Output dari ini adalah:
Ini berbeda dari perl di mana penggantian tidak memerlukan tingkat tambahan untuk melarikan diri:
yang mencetak \ X 2
Ini bisa menjadi gangguan, seperti ketika mencoba menggunakan nilai yang dikembalikan oleh java.sql.DatabaseMetaData.getSearchStringEscape () dengan replaceAll ().
sumber
Utas lama saya tahu tetapi saya agak baru di Jawa dan menemukan salah satu hal yang aneh. Saya telah menggunakan
String.replaceAll()
tetapi mendapatkan hasil yang tidak terduga.Sesuatu seperti ini mengacaukan string:
Jadi saya merancang fungsi ini untuk mengatasi masalah aneh:
Yang membuat Anda bisa melakukan:
sumber
String.replaceAll()
mengharapkan ekspresi reguler bukan argumen literal, itulah sebabnya Anda mendapatkan hasil "tidak dapat diprediksi" (yang benar-benar sangat dapat diprediksi).String.replace()
bekerja seperti yang Anda inginkan.Untuk menambahkan ke "Jawaban Terbaik" yang sudah dipilih (dan yang lainnya sama baiknya dengan Suragch),
String.replace()
dibatasi dengan mengganti karakter yang berurutan (dengan demikian mengambilCharSequence
). Namun,String.replaceAll()
tidak dibatasi dengan mengganti karakter berurutan saja. Anda dapat mengganti karakter yang tidak berurutan juga selama ekspresi reguler Anda dibuat sedemikian rupa.Juga (yang paling penting dan sangat menyakitkan),
replace()
hanya dapat menggantikan nilai-nilai literal; sedangkanreplaceAll
bisa mengganti urutan 'suka' (belum tentu identik).sumber
replace()
Metode tidak menggunakan pola regex sedangkanreplaceAll()
metode menggunakan pola regex. Jadireplace()
kinerjanya lebih cepat daripadareplaceAll()
.sumber
ganti berfungsi pada tipe data char tetapi replaceAll bekerja pada String datatype dan keduanya menggantikan semua kemunculan argumen pertama dengan argumen kedua.
sumber