181

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

4

5 回答 5

264

您可以使用

org.apache.commons.lang3.StringUtils.containsIgnoreCase(CharSequence str,
                                     CharSequence searchStr);

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

空 CharSequence 将返回 false。

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

官方文档参考:StringUtils.containsIgnoreCase

更新 :

如果你是其中之一

  • 不想使用 Apache 公共库
  • 不想使用基于昂贵regex/Pattern的解决方案,
  • 不想通过使用创建额外的字符串对象toLowerCase

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

public boolean regionMatches(boolean ignoreCase,
                             int toffset,
                             String other,
                             int ooffset,
                             int len)

ignoreCase: 如果为真,则在比较字符时忽略大小写。

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;
}
于 2012-12-24T07:39:40.103 回答
260

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

"ABCDEFGHIJKLMNOP".toLowerCase().contains("gHi".toLowerCase())
于 2012-12-24T07:36:42.190 回答
24

您可以使用带有 CASE_INSENSITIVE 标志的 java.util.regex.Pattern 进行不区分大小写的匹配:

Pattern.compile(Pattern.quote(strptrn), Pattern.CASE_INSENSITIVE).matcher(str1).find();
于 2012-12-24T07:35:23.047 回答
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());
    }

}
于 2012-12-24T08:04:56.990 回答
2

优化的 Imran Tariq 版本

Pattern.compile(strptrn, Pattern.CASE_INSENSITIVE + Pattern.LITERAL).matcher(str1).find();

Pattern.quote(strptrn) 总是返回 "\Q" + s + "\E" 即使没有什么要引用的,连接会破坏性能。

于 2012-12-24T08:27:36.463 回答