Bagaimana cara menggunakan metode `string.startsWith ()` dengan mengabaikan kasus?

115

Saya ingin menggunakan string.startsWith()metode tetapi mengabaikan kasusnya.

Misalkan saya memiliki String"Session" dan saya menggunakan startsWith"sEsSi" maka itu harus kembali true.

Bagaimana saya bisa mencapai ini?

Sheetal Bhatewara
sumber
5
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.

Nemesis
sumber
8
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:

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());

Ini salah. Lihat: https://stackoverflow.com/a/15518878/14731


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:

String haystack = "Session";
String needle = "sEsSi";
System.out.println(haystack.regionMatches(true, 0, needle, 0, 5));  // true

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:

System.out.println(haystack.matches("(?i)" + Pattern.quote(needle) + ".*"));

(?i) bendera yang disematkan untuk mengabaikan pencocokan huruf.

Rohit Jain
sumber
1
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
DPM
3
myString.toLowerCase().startsWith(starting.toLowerCase());
agad
sumber
2

coba ini,

String session = "Session";
if(session.toLowerCase().startsWith("sEsSi".toLowerCase()))
pengguna baru
sumber
2

Saya tahu saya terlambat, tetapi bagaimana dengan menggunakan StringUtils.startsWithIgnoreCase () dari Apache Commons Lang 3?

Contoh:

StringUtils.startsWithIgnoreCase(string, "start");

Cukup tambahkan dependensi berikut ke file pom.xml Anda (mengambil hipotesis bahwa Anda menggunakan Maven):

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.11</version>
</dependency>
Sébastien Vandamme
sumber
0

Kamu bisa memakai someString.toUpperCase().startsWith(someOtherString.toUpperCase())

Prasad Kharkar
sumber
-1

Anda selalu bisa melakukannya

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());
RamonBoza
sumber
-1

penggunaan dimulai dengan dan toLowerCase bersama-sama

seperti ini

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());
rachit
sumber