本问题已经有最佳答案,请猛点这里访问。
是否可以确定字符串str1="ABCDEFGHIJKLMNOP"是否包含字符串模式strptrn="gHi"? 我想知道当字符不区分大小写时是否有可能。 如果是这样,怎么办?
使用toUpperCase()?
如果您不使用正则表达式:
"ABCDEFGHIJKLMNOP".toLowerCase().contains("gHi".toLowerCase())
虽然这可能是一个答案,但我认为它不是大型String的好解决方案
这在广泛的Unicode世界中不起作用-请参见stackoverflow.com/a/6996550/372926
像if (file.getName().toLowerCase() .contains(editText.getText().toString().toLowerCase()))
正如所建议的那样,正则表达式将永远是昂贵的。
Unicode的@SamStephens,toLowerCase()将在java7 +中运行。在您的链接中,您可以看到评论的原因。
正确小写。但这并不意味着这种比较适用于所有文化。参见w3.org/International/wiki/Case_folding。他们建议要么指定区域性,要么显式使用区分大小写的比较功能,例如上面显示的containsIgnoreCase。
您可以使用
org.apache.commons.lang3.StringUtils.containsIgnoreCase(CharSequence str,
CharSequence searchStr);
Checks if CharSequence contains a search CharSequence irrespective of
case, handling null. Case-insensitivity is defined as by
String.equalsIgnoreCase(String).
A null CharSequence will return false.
这将比regex更好,因为regex在性能方面总是很昂贵的。
有关官方文档,请参考:StringUtils.containsIgnoreCase
更新:
如果你是那些
不想使用Apache Commons库
不想使用昂贵的基于regex/Pattern的解决方案,
不想使用toLowerCase创建其他字符串对象,
您可以使用java.lang.String.regionMatches实现自己的自定义containsIgnoreCase
public boolean regionMatches(boolean ignoreCase,
int toffset,
String other,
int ooffset,
int len)
ignoreCase:如果为true,则在比较字符时忽略大小写。
public static boolean containsIgnoreCase(String str, String searchStr) {
if(str == null || searchStr == null) return false;
final int length = searchStr.length();
if (length == 0)
return true;
for (int i = str.length() - length; i >= 0; i--) {
if (str.regionMatches(true, i, searchStr, 0, length))
return true;
}
return false;
}
谢谢。还有很多其他不错的东西,例如indexOfIgnoreCase ...
该方法假设大海捞针的匹配部分的长度与针的长度相同,即为UTF-16代码单元数。因此,如果您搜索"并且字符串包含" SS",即使您忽略大小写,即使这两个字符串相同(在德语语言环境中,当然您也必须在每次执行此操作时都必须设置语言环境)才能找到匹配项那类的东西。)
org.apache.commons.lang3.StringUtils此包在android中不可用
您可以将java.util.regex.Pattern与CASE_INSENSITIVE标志一起使用,以区分大小写:
Pattern.compile(Pattern.quote(strptrn), Pattern.CASE_INSENSITIVE).matcher(str1).find();
看一下先前的答案@SamStephens写了stackoverflow.com/a/6996550/372926:您必须同时指定CASE_INSENSITIVE和UNICODE_CASE,但仍然不会获得正确的值,因为Java使用完全大小写映射时,它仅使用简单的大小写折叠。这是个问题。"
尝试这个
public static void main(String[] args)
{
String original ="ABCDEFGHIJKLMNOPQ";
String tobeChecked ="GHi";
System.out.println(containsString(original, tobeChecked, true));
System.out.println(containsString(original, tobeChecked, false));
}
public static boolean containsString(String original, String tobeChecked, boolean caseSensitive)
{
if (caseSensitive)
{
return original.contains(tobeChecked);
}
else
{
return original.toLowerCase().contains(tobeChecked.toLowerCase());
}
}
如果要以区分大小写的方式检查值,则传递true作为第三个参数;如果要以不区分大小写的方式检查值,则传递false。
经过优化的Imran Tariq版本
Pattern.compile(strptrn, Pattern.CASE_INSENSITIVE + Pattern.LITERAL).matcher(str1).find();
即使没有引号,Pattern.quote(strptrn)始终返回" Q" + s +" E",隐藏会损害性能。
您应该使用按位|运算符,而不是加法运算符。