String.replaceAll tanpa RegEx


115

Saya ingin mengganti semua contoh substring dalam sebuah string tetapi String.replaceAll()hanya menerima sebuah pola. String yang saya dapatkan dari pertandingan sebelumnya. Apakah mungkin untuk menambahkan pelarian ke pola yang saya miliki atau ada versi replaceAll()di kelas lain yang menerima string literal alih-alih pola?


Jawaban:


189

Gunakan saja, String.replace(CharSequence,CharSequence)bukan replaceAll.


13
Ini tidak hanya menggantikan yang pertama? Aneh, mereka menyebutnya "replaceAll", bukan "replaceRegex".
Magic Octopus Urn

6
System.out.println("hello world, hello life, hello you".replace("hello","hi"));kembali "hi world, hi life, hi you".
Thiago Mata

14
@MagicOctopusUrn: Ya, saya setuju penamaan yang sangat buruk - ini menyebabkan banyak kebingungan dari waktu ke waktu.
Jon Skeet

penamaan metode yang sangat buruk. Mengapa mereka (sun / oracle) membuat hal-hal sederhana menjadi rumit
Stunner

93

Metode untuk menambahkan pelarian adalah Pattern.quote().

String replaced = myString.replaceAll(Pattern.quote(matchingStr), replacementStr)

Tapi seperti yang dikatakan Jon, Anda bisa menggunakan replace(). Terlepas dari kenyataan bahwa itu menyimpang dari replaceAllnamanya, itu menggantikan semua kejadian seperti itu replaceAll().


Bekerja dengan sempurna jika Anda memiliki "$" di matchingStr misalnya.
Julien Lafont

lebih tepatnya Pattern.compile (); Pattern.quote () membawa hasil yang tidak diinginkan
Pavlo Zvarych

@PavloZvarych: Pattern.compile()mengompilasi string sebagai ekspresi reguler, yang berarti karakter khusus akan diberi arti khusus. Itu kebalikan dari apa yang Pattern.quote()dilakukan, dan apa yang diminta OP ( quote()mengatakan, "perlakukan string sebagai literal"). Mungkin Anda bisa mengembangkan "hasil yang tidak diinginkan" yang sedang Anda bicarakan.
Mark Peters

@MarkPeters itu seperti \\ G1 \\ G untuk "$ 1"
Pavlo Zvarych

1
@PavloZvarych: Jika Anda mencoba mengutip pengganti (dan bukan pola pencarian), Anda ingin menggunakan Matcher.quoteReplacement("$aa +"). Pattern.compile()menghasilkan Pattern, bukan a String, jadi tidak jelas bagi saya bagaimana Anda menggunakannya dalam replaceAll.
Mark Peters
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.