Строка содержит - игнорировать регистр

Можно ли определить, содержит ли строка String str1="ABCDEFGHIJKLMNOP" шаблон строки strptrn="gHi"? Я хотел знать, возможно ли это, когда символы нечувствительны к регистру. Если да, то как?

Ответ 1

Вы можете использовать

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

Проверяет, содержит ли CharSequence поиск CharSequence независимо от случай, обращение null. Нечувствительность к регистру определяется как String.equalsIgnoreCase(String).

Нуль CharSequence вернет false.

Это будет лучше, чем регулярное выражение, поскольку регулярное выражение всегда дорого с точки зрения производительности.

Для официального документа обратитесь к: StringUtils.containsIgnoreCase

Обновление:

Если вы среди тех, кто

  • не хотят использовать библиотеку сообщества Apache
  • не хотят идти с дорогими решениями regex/Pattern,
  • не нужно создавать дополнительный объект строки с помощью toLowerCase,

вы можете реализовать свой собственный containsIgnoreCase с помощью java.lang.String.regionMatches

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

ignoreCase: if true, игнорирует случай при сравнении символов.

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

Ответ 2

Если вы не пойдете с регулярным выражением:

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

Ответ 3

Вы можете использовать java.util.regex.Pattern с флагом CASE_INSENSITIVE для нечувствительности к регистру:

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

Ответ 4

Попробуйте это

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

}

Ответ 5

Оптимизированная версия Imran Tariq

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

Pattern.quote(strptrn) всегда возвращает "\ Q" + s + "\ E", даже если нечего цитировать, concatination портит производительность.