Bootstrap

java contains忽略大小写_关于java:字符串包含-忽略大小写

本问题已经有最佳答案,请猛点这里访问。

是否可以确定字符串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",隐藏会损害性能。

您应该使用按位|运算符,而不是加法运算符。

;