В Java, как проверить, содержит ли строка подстроку (игнорируя случай)? [дубликат]

этот вопрос уже есть ответ здесь:

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

6 ответов


str1.toLowerCase().contains(str2.toLowerCase())

как о 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.*");

Если вы можете использовать org.апаш.палата общин.ленг.StringUtils, Я предлагаю использовать следующие:

String container = "aBcDeFg";
String content = "dE";
boolean containerContainsContent = StringUtils.containsIgnoreCase(container, content);

можно использовать 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, у вас есть только одна строка кода, чтобы изменить.


Я также поддерживаю решение RegEx. Код будет намного чище. Я бы не решился использовать toLowerCase () в ситуациях, когда я знал, что строки будут большими, поскольку строки неизменяемы и должны быть скопированы. Кроме того, решение matches() может быть запутанным, потому что оно принимает регулярное выражение в качестве аргумента (поиск "Need$le" будет проблематичным).

дом на примерах выше:

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 для строк.)

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


Я бы использовал комбинацию метода 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