Как в Java проверить, содержит ли строка подстроку (игнорируя регистр)?

У меня есть две строки, str1 и str2. Как проверить, содержится ли str2 в str1, игнорируя регистр?

Комментарии к вопросу (2)
Решение
str1.toLowerCase().contains(str2.toLowerCase())
Комментарии (9)

Как насчет матчей()`?

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.*");
Комментарии (1)

Если вы в состоянии использовать орг."Апач".общин.яз.StringUtils, я предлагаю использовать следующие:

String container = "aBcDeFg";
String content = "dE";
boolean containerContainsContent = StringUtils.containsIgnoreCase(container, content);
Комментарии (0)

Вы можете использовать метод 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() )
}

Затем вызовите его, используя:

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

Обратите внимание, что, создав свой собственный метод, вы можете использовать его повторно. Затем, когда кто-нибудь укажет, что вам следует использовать contains вместо indexOf, вам придется изменить всего одну строчку кода.

Комментарии (2)

Я также пользу регулярное выражение решение. Код будет гораздо чище. Я бы постеснялся использовать tolowercase() в ситуациях, когда я знал, что струны должны были быть большие, так как строки являются неизменными и должны быть скопированы. Кроме того, матчи() решение может быть запутанным, потому что он принимает регулярное выражение в качестве аргумента (поиск "по параметрам ЛЕ-то&quot$; холодной будет проблематично).

Опираясь на некоторые из приведенных выше примеров:

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

(Примечание: возможно, вы хотите обрабатывать значения NULL и пустые строки по-разному, в зависимости от ваших потребностей. Я думаю, что дорога у меня это ближе к спецификации Java для строк.)

Скорость данные решения могут включать перебора сена посимвольно ищет первый символ иглы. Когда первый символ соответствует (дело insenstively), начать перебора символов иглы по характеру, ищу соответствующий символ в стоге сена и возвращение на "истинный" если все персонажи приглашены. Если не совпадающего символа встречаются, возобновить итерации через стог сена на следующий символ, вернувшись на "ложные" если позиция > сена.Длина (м) - игла.длина() достигается.

Комментарии (2)

Я бы использовал комбинацию метода contains и метода toUpper, которые являются частью класса String. Пример приведен ниже:

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

Это вернет:

Search1=true
Search2=false

Комментарии (2)