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

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

вопрос задан 16.02.2010
trinity
4193 репутация

6 ответов


  • 950 рейтинг
    str1.toLowerCase().contains(str2.toLowerCase())
    
    ответ дан Igor Artamonov, с репутацией 30391, 16.02.2010
  • 120 рейтинг

    Как насчет 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.*");
    
    ответ дан Jim Raynor, с репутацией 1757, 10.04.2011
  • 29 рейтинг

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

    String container = "aBcDeFg";
    String content = "dE";
    boolean containerContainsContent = StringUtils.containsIgnoreCase(container, content);
    
    ответ дан Mojo, с репутацией 291, 5.05.2011
  • 20 рейтинг

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

    ответ дан Vincent Ramdhanie, с репутацией 88129, 16.02.2010
  • 9 рейтинг

    Я также предпочитаю решение RegEx. Код будет намного чище. Я не решался бы использовать toLowerCase () в ситуациях, когда я знал, что строки будут большими, так как строки неизменяемы и должны быть скопированы. Кроме того, решение match () может сбивать с толку, поскольку оно принимает регулярное выражение в качестве аргумента (поиск «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 + "." );
    }
    

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

    Решения, критичные к скорости, могут включать в себя итерацию символа стога сена за символом в поисках первого символа стрелки. Когда первый символ совпадает (без учета регистра), начинайте итерацию по стрелке символ за символом, ища соответствующий символ в стоге сена и возвращая «true», если все символы совпадают. Если встречается несогласованный символ, возобновите итерацию через стог сена на следующем символе, возвращая «false», если позиция & gt; стог сена. длина () - иголка. длина () достигнута.

    ответ дан Michael Cooper, с репутацией 91, 30.12.2012
  • 6 рейтинг

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

    ответ дан SOA Nerd, с репутацией 858, 16.02.2010