【问题标题】:String contains - ignore case [duplicate]字符串包含 - 忽略大小写 [重复]
【发布时间】:2012-12-10 16:57:26
【问题描述】:

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

【问题讨论】:

    标签: java string contains case-insensitive


    【解决方案1】:

    你可以使用

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

    检查 CharSequence 是否包含搜索 CharSequence 案例,处理空值。不区分大小写定义为 String.equalsIgnoreCase(String)。

    null CharSequence 将返回 false。

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

    官方文档请参考:StringUtils.containsIgnoreCase

    更新:

    如果你是其中的一员

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

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

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

    【讨论】:

    • 谢谢。里面还有很多其他的好东西,比如 indexOfIgnoreCase...
    • 该方法假设干草堆的匹配部分的长度将与针的长度相同的 UTF-16 代码单元数。因此,如果您正在搜索“ß”并且字符串包含“SS”,它将找不到匹配项,即使如果您忽略大小写这两个字符串相同(在德语语言环境中,当然您必须每当做这种事情时设置语言环境。)
    • org.apache.commons.lang3.StringUtils 这个包在android中不可用
    【解决方案2】:

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

    "ABCDEFGHIJKLMNOP".toLowerCase().contains("gHi".toLowerCase())
    

    【讨论】:

    • 虽然这可能是一个答案,但我认为这不是一个好的解决方案 Strings
    • 这在广泛的 unicode 世界中不起作用 - 请参阅 stackoverflow.com/a/6996550/372926
    • 点赞if (file.getName().toLowerCase() .contains(editText.getText().toString().toLowerCase()))
    • 确实如建议的那样,正则表达式总是很昂贵。
    • 它正确小写。但这并不意味着这种比较适用于所有文化。见w3.org/International/wiki/Case_folding。他们建议要么指定一种文化,要么明确使用不区分大小写的比较函数,例如上面显示的 containsIgnoreCase。
    【解决方案3】:

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

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

    【讨论】:

    • 看看前面的答案@SamStephens 写了stackoverflow.com/a/6996550/372926:你必须同时指定 CASE_INSENSITIVE 和 UNICODE_CASE,你仍然不会得到正确的值,因为虽然 Java 使用全大小写映射,但它只使用简单的案例折叠。这是个问题。”
    【解决方案4】:

    试试这个

    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。
    【解决方案5】:

    优化的 Imran Tariq 版本

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

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

    【讨论】:

    • 你应该使用按位 |运算符而不是加法运算符。
    猜你喜欢
    • 2013-05-12
    • 1970-01-01
    • 2015-07-18
    • 2010-09-08
    • 1970-01-01
    • 2016-08-22
    • 2015-09-12
    • 1970-01-01
    • 2016-01-29
    相关资源
    最近更新 更多