Saya punya dua String,
str1dan
str2. Bagaimana cara memeriksa apakah
str2yang terkandung dalam
str1`, mengabaikan kasus ini?
Bagaimana tentang pertandingan()
?
String string = "Madam, I am Adam";
// Starts with
boolean b = string.startsWith("Mad"); // true
// Ends with
b = string.endsWith("dam"); // true
// Anywhere
b = string.indexOf("I am") >= 0; // true
// To ignore case, regular expressions must be used
// Starts with
b = string.matches("(?i)mad.*");
// Ends with
b = string.matches("(?i).*adam");
// Anywhere
b = string.matches("(?i).*i am.*");
Jika anda dapat menggunakan org.apache.commons.lang.StringUtils, saya sarankan menggunakan yang berikut ini:
String container = "aBcDeFg";
String content = "dE";
boolean containerContainsContent = StringUtils.containsIgnoreCase(container, content);
Anda dapat menggunakan toLowerCase()
metode:
public boolean contains( String haystack, String needle ) {
haystack = haystack == null ? "" : haystack;
needle = needle == null ? "" : needle;
// Works, but is not the best.
//return haystack.toLowerCase().indexOf( needle.toLowerCase() ) > -1
return haystack.toLowerCase().contains( needle.toLowerCase() )
}
Kemudian menyebutnya menggunakan:
if( contains( str1, str2 ) ) {
System.out.println( "Found " + str2 + " within " + str1 + "." );
}
Perhatikan bahwa dengan menciptakan metode anda sendiri, anda dapat menggunakan kembali itu. Kemudian, ketika seseorang menunjukkan bahwa anda harus menggunakan berisi
bukan indexOf
, anda hanya memiliki satu baris kode untuk mengubah.
Saya juga mendukung ekspresi reguler solusi. Kode akan jauh lebih bersih. Aku akan ragu-ragu untuk menggunakan toLowerCase() dalam situasi di mana aku tahu string yang akan menjadi besar, karena string yang berubah dan akan disalin. Juga, pertandingan() solusi yang mungkin membingungkan karena itu dibutuhkan sebuah ekspresi reguler sebagai argumen (mencari "Perlu$le" dingin akan bermasalah).
Bangunan pada beberapa contoh di atas:
public boolean containsIgnoreCase( String haystack, String needle ) {
if(needle.equals(""))
return true;
if(haystack == null || needle == null || haystack .equals(""))
return false;
Pattern p = Pattern.compile(needle,Pattern.CASE_INSENSITIVE+Pattern.LITERAL);
Matcher m = p.matcher(haystack);
return m.find();
}
example call:
String needle = "Need$le";
String haystack = "This is a haystack that might have a need$le in it.";
if( containsIgnoreCase( haystack, needle) ) {
System.out.println( "Found " + needle + " within " + haystack + "." );
}
(Catatan: anda mungkin ingin untuk menangani NOL dan kosong string yang berbeda, tergantung pada kebutuhan anda. Saya pikir mereka cara saya itu adalah lebih dekat ke Jawa spec untuk string.)
Kecepatan kritis solusi yang dapat mencakup iterasi melalui tumpukan jerami karakter dengan karakter mencari karakter pertama dari jarum. Ketika karakter pertama adalah cocok (kasus insenstively), mulai iterasi melalui jarum karakter dengan karakter, mencari karakter yang sesuai dalam tumpukan jerami dan kembali "benar" jika semua karakter mendapatkan cocok. Jika seorang non-sesuai karakter ditemui, resume iterasi melalui tumpukan jerami pada karakter berikutnya, kembali "salah" jika posisi > jerami.length() - jarum.length() tercapai.
I'd gunakan kombinasi yang berisi metode dan toUpper
metode yang merupakan bagian dari class String. Contoh di bawah ini:
String string1 = "AAABBBCCC";
String string2 = "DDDEEEFFF";
String searchForThis = "AABB";
System.out.println("Search1="+string1.toUpperCase().contains(searchForThis.toUpperCase()));
System.out.println("Search2="+string2.toUpperCase().contains(searchForThis.toUpperCase()));
Ini akan mengembalikan:
Search1=true
Search2=false