在Java中,如何检查一个string是否包含子string(忽略大小写)?

我有两个String s, str1str2 。 如何检查str2是否包含在str1 ,忽略大小写?

 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.apache.commons.lang.StringUtils ,我build议使用以下内容:

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

请注意,通过创build您自己的方法,您可以重用它。 然后,当有人指出,你应该使用contains而不是indexOf ,你只有一行代码来改变。

我也赞成RegEx解决scheme。 代码将会更清洁。 我会犹豫在使用toLowerCase()的情况下,我知道string会很大,因为string是不可变的,将不得不被复制。 此外,matches()解决scheme可能会令人困惑,因为它需要一个正则expression式作为参数(search“需要$”冷是有问题的)。

基于以上的一些例子:

 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和空string,我认为它们更接近Java规范中的string)。

速度的关键解决scheme可以包括迭代大海捞针,寻找针的第一个字符。 当第一个字符匹配时(不区分大小写),开始迭代遍历字符,在草垛中寻找相应的字符,如果所有字符匹配,则返回“true”。 如果遇到不匹配的字符,则在下一个字符处继续迭代大草堆,如果位置> haystack.length() – needle.length(),则返回“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 =真
search2 =假