web-dev-qa-db-fra.com

String contient - ignore la casse

Est-il possible de déterminer si une chaîne str1="ABCDEFGHIJKLMNOP" contient un modèle de chaîne strptrn="gHi"? Je voulais savoir si c'était possible lorsque les personnages étaient insensibles à la casse. Si c'est le cas, comment?

150
AlwaysALearner

Vous pouvez utiliser

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

Vérifie si CharSequence contient une recherche CharSequence indépendamment du cas, en traitant null. L'insensibilité à la casse est définie par String.equalsIgnoreCase (String).

Un CharSequence nul renverra false.

Celui-ci sera meilleur que regex car regex est toujours cher en termes de performances.

Pour la documentation officielle, voir: StringUtils.containsIgnoreCase

Mise à jour:

Si vous êtes parmi ceux qui

  • ne veulent pas utiliser la bibliothèque Apache commons
  • vous ne voulez pas utiliser les solutions coûteuses basées sur regex/Pattern,
  • ne veut pas créer d'objet string supplémentaire en utilisant toLowerCase,

vous pouvez implémenter votre propre containsIgnoreCase personnalisée en utilisant Java.lang.String.regionMatches

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

ignoreCase: si vrai, ignore la casse lors de la comparaison de 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;
}
222
Rahul

Si vous n'allez pas avec regex:

"ABCDEFGHIJKLMNOP".toLowerCase().contains("gHi".toLowerCase())
236
PeterMmm

Vous pouvez utiliser Java.util.regex.Pattern avec l'indicateur CASE_INSENSITIVE pour la correspondance sans distinction de casse:

Pattern.compile(Pattern.quote(strptrn), Pattern.CASE_INSENSITIVE).matcher(str1).find();
22

Essaye ça

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

}
8
Rais Alam

Une version optimisée d'Imran Tariq

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

Pattern.quote (strptrn) retourne toujours "\ Q" + s + "\ E" même s'il n'y a rien à citer, la concaturation nuit à la performance.

2
Evgeniy Dorofeev