Menggunakan metode replace(CharSequence target, CharSequence replacement)
dalam String, bagaimana saya bisa membuat target case-insensitive?
Misalnya, cara kerjanya sekarang:
String target = "FooBar";
target.replace("Foo", "") // would return "Bar"
String target = "fooBar";
target.replace("Foo", "") // would return "fooBar"
Bagaimana saya bisa membuatnya jadi ganti (atau jika ada metode yang lebih cocok) adalah case-insensitive sehingga kedua contoh mengembalikan "Bar"?
target.replaceAll("(?i)"+Pattern.quote("foo"), "");
Jika Anda tidak peduli dengan kasus, maka Anda mungkin tidak masalah jika mengembalikan semua huruf besar:
sumber
Tidak seanggun pendekatan lain tetapi cukup solid dan mudah diikuti, esp. untuk orang yang lebih baru ke Jawa. Satu hal yang membuat saya tentang kelas String adalah ini: Ini sudah ada untuk waktu yang sangat lama dan sementara itu mendukung penggantian global dengan regexp dan ganti global dengan Strings (via CharSequences), yang terakhir tidak memiliki parameter boolean sederhana : 'isCaseInsensitive'. Sungguh, Anda akan berpikir bahwa hanya dengan menambahkan satu tombol kecil, semua masalah yang disebabkan ketidakhadirannya untuk pemula terutama bisa dihindari. Sekarang di JDK 7, String masih tidak mendukung penambahan kecil ini!
Baiklah, saya akan berhenti mencengkeram. Untuk semua orang khususnya yang lebih baru ke Jawa, inilah de- ex machina cut-and-paste Anda . Seperti yang saya katakan, tidak elegan dan tidak akan memenangkan hadiah kodekan yang licin, tetapi berhasil dan dapat diandalkan. Setiap komentar, silakan berkontribusi. (Ya, saya tahu, StringBuffer mungkin merupakan pilihan yang lebih baik untuk mengelola dua garis mutasi karakter string, tetapi cukup mudah untuk menukar teknik.)
sumber
Ekspresi reguler cukup rumit untuk dikelola karena fakta bahwa beberapa karakter dicadangkan: misalnya,
"foo.bar".replaceAll(".")
menghasilkan string kosong, karena titik berarti "apa pun" Jika Anda ingin mengganti hanya titik yang harus ditunjukkan sebagai parameter"\\."
.Solusi yang lebih sederhana adalah dengan menggunakan objek StringBuilder untuk mencari dan mengganti teks. Dibutuhkan dua: satu yang berisi teks dalam versi huruf kecil sedangkan yang kedua berisi versi asli. Pencarian dilakukan pada konten huruf kecil dan indeks yang terdeteksi juga akan menggantikan teks asli.
sumber
Untuk karakter non-Unicode:
sumber
org.apache.commons.lang3.StringUtils:
public static String replaceIgnoreCase (Teks string, String searchString, Penggantian string)
Case tidak sensitif menggantikan semua kemunculan String dalam String lain.
sumber
Saya suka SMA 's jawaban yang menggunakan
replaceAll
dengan ekspresi reguler. Jika Anda akan melakukan penggantian yang sama berkali-kali, masuk akal untuk melakukan pra-kompilasi ekspresi reguler satu kali:sumber
Sederhananya tanpa perpustakaan pihak ketiga:
sumber