Am două String
s, str1 " și " str2. Cum pot verifica dacă
str2este conținută într
str1`, ignorând caz?
Cât despre meciuri()`?
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.*");
Dacă sunteți capabili de a utiliza org.apache.commons.lang.StringUtils, am sugerăm să utilizați următoarele opțiuni:
String container = "aBcDeFg";
String content = "dE";
boolean containerContainsContent = StringUtils.containsIgnoreCase(container, content);
Puteți utiliza toLowerCase()
metoda:
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() )
}
Apoi suna-l folosind:
if( contains( str1, str2 ) ) {
System.out.println( "Found " + str2 + " within " + str1 + "." );
}
Observați că, prin crearea de propriul dvs. de metodă, puteți reutiliza. Apoi, când cineva subliniază că ar trebui să utilizați "conține" în loc de indexOf
, ai doar o singură linie de cod pentru a schimba.
Am, de asemenea, în favoarea RegEx soluție. Codul va fi mult mai curat. Mi-ar ezita să folosească toLowerCase() în situațiile în care știam că sforile au fost de gând să fie mare, deoarece siruri de caractere sunt imuabile și ar trebui să fie copiate. De asemenea, meciurile() soluție ar putea fi confuz, deoarece este nevoie de o expresie regulată ca un argument (în căutarea pentru "Trebuie$le" la rece fi problematic).
Clădirea de pe unele dintre exemplele de mai sus:
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 + "." );
}
(Notă: s-ar putea dori să se ocupe de NUL și siruri de caractere goale diferit, în funcție de nevoile dumneavoastră. Cred că modul în care am este mai aproape de Java spec pentru siruri de caractere.)
Viteza critică soluții ar putea include iterarea prin fân caracter cu caracter în căutarea pentru primul caracter de la ac. Când primul caracter este compensată (caz insenstively), începe iterarea prin ac caracter cu caracter, caut caracterului corespunzător în carul cu fân și se întorc "adevărat" dacă toate personajele se potrivesc. Dacă un non-potrivire de caracter este întâlnită, cv-ul repetare prin fân la următorul caracter, revenind "false" daca o poziție > cu fân.lungime() - ac.lungime() este atins.
Am'd folosi o combinație a conține metoda și toUpper
metoda care fac parte din clasa String. Un exemplu este dat mai jos:
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()));
Acest lucru va reveni:
Search1=true
Search2=false