Pencocokan String yang Tidak Peka Huruf Besar-Kecil di Java

1. Ikhtisar

Ada banyak cara untuk memeriksa apakah String berisi substring. Dalam artikel ini, kita akan mencari substring dalam String sambil berfokus pada solusi case-insensitive untuk String.contains () di Java. Yang terpenting, kami akan memberikan contoh cara mengatasi masalah ini.

2. Solusi Paling Sederhana: String.toLowerCase

Solusi paling sederhana adalah dengan menggunakan String.toLowerCase () . Dalam kasus ini, kita akan mengubah kedua string menjadi huruf kecil dan kemudian menggunakan metode contains () :

assertTrue(src.toLowerCase().contains(dest.toLowerCase()));

Kita juga bisa menggunakan String.toUpperCase () dan itu akan memberikan hasil yang sama.

3. String . Cocok Dengan Ekspresi Reguler

Opsi lainnya adalah dengan menggunakan String.matches () dengan ekspresi reguler:

assertTrue(src.matches("(?i).*" + dest + ".*"));

Metode match () menggunakan S tring untuk mewakili ekspresi reguler. (? i) mengaktifkan case-insensitivity dan . * menggunakan setiap karakter kecuali jeda baris.

4. String.regionMatches

Kita juga bisa menggunakan String.regionMatches () . Ia memeriksa apakah dua wilayah String cocok, menggunakan true untuk parameter ignoreCase :

public static boolean processRegionMatches(String src, String dest) { for (int i = src.length() - dest.length(); i >= 0; i--) if (src.regionMatches(true, i, dest, 0, dest.length())) return true; return false; }
assertTrue(processRegionMatches(src, dest));

Untuk meningkatkan kinerja, itu mulai mencocokkan wilayah, dengan mempertimbangkan panjang String tujuan . Kemudian, ini mengurangi iterator.

5. Pola Dengan Opsi CASE_INSENSITIVE

Kelas java.util.regex.Pattern memberi kita cara untuk mencocokkan string menggunakan metode matcher () . Dalam kasus ini, kita bisa menggunakan metode quote () untuk menghindari karakter khusus, dan tanda CASE_INSENSITIVE . Mari lihat:

assertTrue(Pattern.compile(Pattern.quote(dest), Pattern.CASE_INSENSITIVE) .matcher(src) .find());

6. Apache Commons StringUtils.containsIgnoreCase

Terakhir, kita akan memanfaatkan kelas StringUtils Apache Commons :

assertTrue(StringUtils.containsIgnoreCase(src, dest));

7. Perbandingan Kinerja

Seperti dalam artikel umum tentang memeriksa substring menggunakan metode berisi , kami menggunakan kerangka kerja sumber terbuka Java Microbenchmark Harness (JMH) untuk membandingkan kinerja metode dalam nanodetik :

  1. Pola CASE_INSENSITIVE Ekspresi Reguler : 399,387 ns
  2. String keLowerCase : 434.064 ns
  3. Apache Commons StringUtils : 496.313 ns
  4. Wilayah String Cocok : 718.842 ns
  5. String cocok dengan Regular Expression : 3964.346 ns

Seperti yang bisa kita lihat, pemenangnya adalah Pola dengan bendera CASE_INSENSITIVE diaktifkan, diikuti oleh toLowerCase () . Kami juga melihat peningkatan kinerja yang jelas antara Java 8 dan Java 11.

8. Kesimpulan

Dalam tutorial ini, kami melihat beberapa cara berbeda untuk memeriksa String untuk substring, sambil mengabaikan case di Java.

Kami melihat menggunakan String.toLowerCase () dan toUpperCase () , String.matches () , String.regionMatches () , Apache Commons StringUtils.containsIgnoreCase () , dan Pattern.matcher (). Find () .

Selain itu, kami mengevaluasi kinerja setiap solusi dan menemukan bahwa menggunakan metode compile () dari java.util.regex.Pattern dengan flag CASE_INSENSITIVE memiliki kinerja terbaik .

Seperti biasa, kode tersedia di GitHub.