it-swarm.com.ru

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

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

499
trinity
str1.toLowerCase().contains(str2.toLowerCase())
997
Igor Artamonov

Как насчет 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.*");
122
Jim Raynor

Если вы можете использовать org.Apache.commons.lang.StringUtils, я предлагаю использовать следующее:

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

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

20
Vincent Ramdhanie

Я также одобряю решение 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 + "." );
}

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

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

10
Michael Cooper

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

6
SOA Nerd