Tidak ada alasan untuk menutup pertanyaan ini. Bagaimanapun, solusi terbaik adalah menggunakan string.regionMatches(true, 0, prefix, 0, prefix.length());yang tidak menimbulkan biaya untuk "menormalkan" kedua string.
isapir
@AlexanderAbakumov Baik oleh saya. Jawaban yang benar diposting di komentar saya di atas. Ini jauh lebih efisien daripada mengubah kasus string. Akan lebih baik untuk meningkatkannya menjadi jawaban daripada komentar.
isapir
Jawaban:
98
Gunakan toUpperCase()atau toLowerCase()untuk menstandarkan string Anda sebelum mengujinya.
Masalah besar di sini adalah kinerjanya. Untuk String kecil tidak masalah, tetapi jika Anda memiliki yang besar ... Maksud saya ... Apakah Anda benar-benar akan melakukan toUpperCase dalam String 1mb hanya untuk membandingkan 4-10 karakter awal?
Dyorgio
4
Hum bahkan jika saya tidak dapat melihat mengapa saya ingin membandingkan bagian awal dari String 1mb maka jika hanya 4 - 10 karakter awal yang menarik minat saya, saya menggunakan substring dan kemudian menormalkan dan selesai ...
Nemesis
3
Jawaban ini (dan semua jawaban lain yang ditemukan di sini) salah. Jika Anda melihat penerapannya, String.equalsIgnoreCase()Anda akan menemukan bahwa Anda perlu membandingkan versi huruf kecil dan huruf besar dari String sebelum Anda dapat kembali secara meyakinkan false. Lihat stackoverflow.com/a/38947571/14731 untuk jawaban alternatif.
Gili
10
Jawaban ini tidak benar karena toLowerCase () menggunakan Locale.getDefault () secara internal untuk mengubah karakter dan itu mungkin menyebabkan negatif palsu. Katakanlah Anda ingin membandingkan "İstanbul" dengan "istanbul". Dalam bahasa Turki, huruf kecil "İ" setara dengan "ı". Jadi ketika saya mencoba melakukan itu "İstanbul".toLowerCase().startsWith("istanbul".toLowerCase())(di lingkungan Locale.Turkish), itu akan memberi saya kesalahan.
Mustafa Berkay Mutlu
1
@Nemesis, Jawaban ini salah, menganggapnya sebagai jawaban yang diterima bisa menyesatkan bagi banyak orang. Tolong edit jawaban Anda dan tautkan ke jawaban Rohit Jain.
Moha unta yang maha kuasa
88
Salah satu opsinya adalah mengonversi keduanya menjadi huruf kecil atau huruf besar:
Pilihan lainnya adalah menggunakan String#regionMatches()metode, yang mengambil argumen boolean yang menyatakan apakah akan melakukan pencocokan peka huruf besar / kecil atau tidak. Anda bisa menggunakannya seperti ini:
Ia memeriksa apakah daerah needledari indeks 0sampai panjang 5ada haystackmulai dari indeks 0sampai panjang 5atau tidak. Argumen pertama adalah true, artinya akan melakukan pencocokan tidak peka huruf besar / kecil.
Dan jika Anda adalah penggemar berat Regex , Anda dapat melakukan hal seperti ini:
Sebenarnya, misalkan ada tabel yang memiliki lebih dari 1 lakh entri, dan saya menggunakan loop for pada kolom tertentu untuk mengurai semua entri itu dan di dalamnya, saya mencoba menggunakan opsi huruf kecil di atas untuk mencari entri yang dimulai dengan pola tertentu . Jadi, ini menyebabkan masalah kinerja. Jika tidak ada kecocokan yang ditemukan sama sekali, maka secara internal akan mengurai semua entri, yang akan memakan banyak waktu, karena secara bersamaan diubah menjadi huruf kecil juga. Jadi apakah ada pilihan lain, untuk mengatasi masalah kinerja?
Sheetal Bhatewara
@Rohit Jain, sebenarnya ini: System.out.println("Session".toLowerCase().startsWith("sEsSi".toLowerCase()));bukanlah solusi yang tepat. Anda dapat mencoba ini: System.out.println("SessIon".toLowerCase().startsWith("sEsSi".toLowerCase()));dengan argumen vm -Duser.country=TR -Duser.language=tr Dalam contoh ini Iadalah huruf besari
string.regionMatches(true, 0, prefix, 0, prefix.length());
yang tidak menimbulkan biaya untuk "menormalkan" kedua string.Jawaban:
Gunakan
toUpperCase()
atautoLowerCase()
untuk menstandarkan string Anda sebelum mengujinya.sumber
String.equalsIgnoreCase()
Anda akan menemukan bahwa Anda perlu membandingkan versi huruf kecil dan huruf besar dari String sebelum Anda dapat kembali secara meyakinkanfalse
. Lihat stackoverflow.com/a/38947571/14731 untuk jawaban alternatif."İstanbul".toLowerCase().startsWith("istanbul".toLowerCase())
(di lingkungan Locale.Turkish), itu akan memberi saya kesalahan.Salah satu opsinya adalah mengonversi keduanya menjadi huruf kecil atau huruf besar:Ini salah. Lihat: https://stackoverflow.com/a/15518878/14731Pilihan lainnya adalah menggunakan
String#regionMatches()
metode, yang mengambil argumen boolean yang menyatakan apakah akan melakukan pencocokan peka huruf besar / kecil atau tidak. Anda bisa menggunakannya seperti ini:Ia memeriksa apakah daerah
needle
dari indeks0
sampai panjang5
adahaystack
mulai dari indeks0
sampai panjang5
atau tidak. Argumen pertama adalahtrue
, artinya akan melakukan pencocokan tidak peka huruf besar / kecil.Dan jika Anda adalah penggemar berat Regex , Anda dapat melakukan hal seperti ini:
(?i)
bendera yang disematkan untuk mengabaikan pencocokan huruf.sumber
System.out.println("Session".toLowerCase().startsWith("sEsSi".toLowerCase()));
bukanlah solusi yang tepat. Anda dapat mencoba ini:System.out.println("SessIon".toLowerCase().startsWith("sEsSi".toLowerCase()));
dengan argumen vm-Duser.country=TR -Duser.language=tr
Dalam contoh iniI
adalah huruf besari
sumber
coba ini,
sumber
Saya tahu saya terlambat, tetapi bagaimana dengan menggunakan StringUtils.startsWithIgnoreCase () dari Apache Commons Lang 3?
Contoh:
Cukup tambahkan dependensi berikut ke file pom.xml Anda (mengambil hipotesis bahwa Anda menggunakan Maven):
sumber
Kamu bisa memakai
someString.toUpperCase().startsWith(someOtherString.toUpperCase())
sumber
Anda selalu bisa melakukannya
sumber
penggunaan dimulai dengan dan toLowerCase bersama-sama
seperti ini
sumber