字符串包含 - 忽略大小写

Alw*_*ner 156 java string contains case-insensitive

是否可以确定String是否str1="ABCDEFGHIJKLMNOP"包含字符串模式strptrn="gHi"?我想知道当角色不区分大小写时是否可能.如果是这样,怎么样?

Pet*_*Mmm 236

如果你不使用正则表达式:

"ABCDEFGHIJKLMNOP".toLowerCase().contains("gHi".toLowerCase())
Run Code Online (Sandbox Code Playgroud)

  • 这在unicode的广阔世界中不起作用 - 请参阅http://stackoverflow.com/a/6996550/372926 (20认同)
  • 虽然这可能是一个答案,但我认为这不是一个很好的解决方案 (3认同)
  • 它正确地降低了.但这并不意味着这种比较适用于所有文化.见http://www.w3.org/International/wiki/Case_folding.他们建议指定一种文化,或者明确使用案例因子比较函数,例如上面显示的containsIgnoreCase. (2认同)

Rah*_*hul 228

您可以使用

org.apache.commons.lang3.StringUtils.containsIgnoreCase(CharSequence str,
                                     CharSequence searchStr);
Run Code Online (Sandbox Code Playgroud)

检查CharSequence是否包含搜索CharSequence而不考虑大小写,处理null.不区分大小写由String.equalsIgnoreCase(String)定义.

null CharSequence将返回false.

这个将比正则表达更好,因为正则表达式在性能方面总是很昂贵.

有关官方文档,请参阅:StringUtils.containsIgnoreCase

更新:

如果你是那些人

  • 不想使用Apache commons库
  • 不想使用昂贵regex/Pattern的解决方案,
  • 不希望通过使用创建其他字符串对象toLowerCase,

您可以containsIgnoreCase使用java.lang.String.regionMatches实现自己的自定义

public boolean regionMatches(boolean ignoreCase,
                             int toffset,
                             String other,
                             int ooffset,
                             int len)
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 该方法假设干草堆的匹配部分的长度与针的长度相同的UTF-16代码单元的数量.因此,如果您正在搜索"ß"并且字符串包含"SS",则它将找不到匹配项,即使这两个字符串相同但是如果您忽略该情况(在德语区域设置中,当然您必须在做这种事情的时候设置语言环境.) (7认同)
  • org.apache.commons.lang3.StringUtils这个包在android中不可用 (3认同)

Muh*_*riq 22

您可以将java.util.regex.Pattern与CASE_INSENSITIVE标志一起用于不区分大小写的匹配:

Pattern.compile(Pattern.quote(strptrn), Pattern.CASE_INSENSITIVE).matcher(str1).find();
Run Code Online (Sandbox Code Playgroud)


Rai*_*lam 8

试试这个

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

}
Run Code Online (Sandbox Code Playgroud)