在Java中,如何检查字符串是否包含子字符串(忽略大小写)?

时间:2010-02-16 17:45:55

标签: java string substring

我有两个Stringstr1str2。如何检查str2中是否包含str1,忽略大小写?

6 个答案:

答案 0 :(得分:994)

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

答案 1 :(得分:122)

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

答案 2 :(得分:30)

如果您能够使用 org.apache.commons.lang.StringUtils ,我建议使用以下内容:

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

答案 3 :(得分: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时,您只需更改一行代码。

答案 4 :(得分:10)

我也赞成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规范。)

速度关键解决方案可以包括通过角色迭代查找针的第一个字符。当第一个字符匹配时(不区分大小写),开始逐个字符地迭代针,在大海捞针中查找相应的字符,如果所有字符都匹配则返回“true”。如果遇到不匹配的字符,则通过下一个字符的haystack继续迭代,如果位置> 1,则返回“false”。 haystack.length() - 达到了needle.length()。

答案 5 :(得分:6)

我将使用contains方法和属于String类的toUpper方法的组合。一个例子如下:

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

这将返回:

  

搜索1 =真
      搜索2 =假