我也赞成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继续迭代,如果位置>则返回“false”。 haystack.length() - 达到了needle.length()。