En Java, Comment puis-je vérifier si une chaîne de caractères contient une sous-chaîne (ignoring case)? [dupliquer]

cette question a déjà une réponse ici:

  • Comment vérifier si une chaîne contient une autre chaîne d'une manière non sensible à la casse en Java? 17 réponses

j'ai deux String s, str1 et str2 . Comment puis-je vérifier si str2 est contenu dans str1 , ignorant case?

468
demandé sur Peter Mortensen 2010-02-16 20:45:54

6 réponses

str1.toLowerCase().contains(str2.toLowerCase())
951
répondu Igor Artamonov 2010-02-16 17:49:47

et matches() ?

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.*");
120
répondu Jim Raynor 2017-11-08 18:07:23

si vous êtes en mesure d'utiliser org.Apache.commun.lang.StringUtils , je suggère d'utiliser ce qui suit:

String container = "aBcDeFg";
String content = "dE";
boolean containerContainsContent = StringUtils.containsIgnoreCase(container, content);
29
répondu Mojo 2012-03-08 22:15:04

vous pouvez utiliser la méthode toLowerCase() :

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() )
}

alors appelez-le en utilisant:

if( contains( str1, str2 ) ) {
  System.out.println( "Found " + str2 + " within " + str1 + "." );
}

notez qu'en créant votre propre méthode, vous pouvez la réutiliser. Puis, quand quelqu'un fait remarquer que vous devez utiliser contains au lieu de indexOf , vous n'avez qu'une seule ligne de code à modifier.

20
répondu Vincent Ramdhanie 2010-02-16 18:10:10

je suis également favorable à la solution RegEx. Le code sera beaucoup plus propre. J'hésiterais à utiliser toLowerCase () dans des situations où je savais que les cordes seraient grandes, puisque les cordes sont immuables et devraient être copiées. De plus, la solution matches() peut être déroutante car elle prend une expression régulière comme argument (la recherche de "Need$le" est problématique).

s'appuyant sur certains des exemples ci-dessus:

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 + "." );
}

(Note: vous pourriez vouloir gérer les chaînes nulles et vides différemment selon vos besoins. Je pense que la façon dont je l'ai c'est plus proche de la spécification Java pour les cordes.)

les solutions critiques en matière de vitesse pourraient inclure l'itération du caractère haystack par le caractère à la recherche du premier caractère de l'aiguille. Lorsque le premier caractère est apparié (cas insensivement), commencer itérer à travers l'aiguille caractère par caractère, à la recherche du caractère correspondant dans le botte de foin et renvoie "true" si tous les caractères sont accompagnés. Si un caractère non-apparié est rencontré, reprendre l'itération à travers la botte de foin au caractère suivant, en retournant "false" si une position > botte de foin.length() - aiguille.longueur() est atteint.

9
répondu Michael Cooper 2012-12-30 23:23:51

j'utiliserais une combinaison de la méthode contains et de la méthode toUpper qui font partie de la classe String. Un exemple est ci-dessous:

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()));

Ce sera de retour:

Search1=true

Search2=false

6
répondu SOA Nerd 2017-04-09 19:59:07