Chaîne contient - ignorer la casse [dupliquer]

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

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

est-il possible de déterminer si une chaîne de caractères str1="ABCDEFGHIJKLMNOP" contient une chaîne de caractères strptrn="gHi" ? Je voulais savoir si c'est possible lorsque les caractères sont insensibles à la casse. Si oui, comment?

140
demandé sur Tom 2012-12-24 11:33:11

5 réponses

vous pouvez utiliser

org.apache.commons.lang3.StringUtils.containsIgnoreCase(CharSequence str,
                                     CharSequence searchStr);

vérifie si CharSequence contient une CharSequence de recherche indépendamment de cas, traitement null. L'insensibilité à la casse est défini que par Chaîne.equalsIgnoreCase(Chaîne de caractères).

null CharSequence retournera false.

celui-ci sera meilleur que regex car regex est toujours cher en termes de performance.

Pour officiel doc, reportez-vous à : StringUtils.containsIgnoreCase

mise à jour:

Si vous êtes parmi ceux qui

  • ne veulent pas l'utilisation d'Apache commons library
  • ne veulent pas aller avec le cher regex/Pattern solutions
  • Je ne veux pas créer d'objet chaîne supplémentaire en utilisant toLowerCase ,

vous pouvez mettre en œuvre votre propre coutume containsIgnoreCase en utilisant java.lang.Chaîne.regionMatches

public boolean regionMatches(boolean ignoreCase,
                             int toffset,
                             String other,
                             int ooffset,
                             int len)

ignoreCase : si elle est vraie, ne tient pas compte du cas lors de la comparaison des caractères.

public static boolean containsIgnoreCase(String str, String searchStr)     {
    if(str == null || searchStr == null) return false;

    final int length = searchStr.length();
    if (length == 0)
        return true;

    for (int i = str.length() - length; i >= 0; i--) {
        if (str.regionMatches(true, i, searchStr, 0, length))
            return true;
    }
    return false;
}
206
répondu Rahul 2017-03-22 15:19:36

Si vous ne voulez pas aller avec les regex:

"ABCDEFGHIJKLMNOP".toLowerCase().contains("gHi".toLowerCase())
222
répondu PeterMmm 2012-12-24 07:36:42

vous pouvez utiliser java.util.regex.Modèle avec les CASE_INSENSITIVE drapeau de correspondance insensible à la casse:

Pattern.compile(Pattern.quote(strptrn), Pattern.CASE_INSENSITIVE).matcher(str1).find();
22
répondu Muhammad Imran Tariq 2012-12-24 07:35:23

Essayez cette

public static void main(String[] args)
{

    String original = "ABCDEFGHIJKLMNOPQ";
    String tobeChecked = "GHi";

    System.out.println(containsString(original, tobeChecked, true));        
    System.out.println(containsString(original, tobeChecked, false));

}

public static boolean containsString(String original, String tobeChecked, boolean caseSensitive)
{
    if (caseSensitive)
    {
        return original.contains(tobeChecked);

    }
    else
    {
        return original.toLowerCase().contains(tobeChecked.toLowerCase());
    }

}
7
répondu Rais Alam 2013-01-15 14:52:07

une version optimisée D'Imran Tariq

Pattern.compile(strptrn, Pattern.CASE_INSENSITIVE + Pattern.LITERAL).matcher(str1).find();

motif.citation (strptrn) retourne toujours "\Q" + s + "\E" même s'il n'y a rien à citer, la concatination gâte la performance.

1
répondu Evgeniy Dorofeev 2012-12-24 08:34:35