假设我有两个字符串,

String s1 = "AbBaCca";
String s2 = "bac";

我想执行一个检查,返回s2包含在s1中。我可以这样做:

return s1.contains(s2);

我非常确定contains()是区分大小写的,但是我不能从阅读文档中确定这一点。如果是的话,我想我最好的方法是:

return s1.toLowerCase().contains(s2.toLowerCase());

撇开所有这些不谈,有没有另一种(可能更好的)方法可以在不考虑大小写敏感性的情况下完成这个任务?


当前回答

一个更简单的方法(不用担心模式匹配)是将两个string都转换为小写:

String foobar = "fooBar";
String bar = "FOO";
if (foobar.toLowerCase().contains(bar.toLowerCase()) {
    System.out.println("It's a match!");
}

其他回答

如果你必须在另一个ASCII字符串中搜索一个ASCII字符串,比如URL,你会发现我的解决方案更好。我测试了icza和我的方法的速度,结果如下:

案例1用了2788 ms - regionMatches 病例2用了1520毫秒

代码:

public static String lowerCaseAscii(String s) {
    if (s == null)
        return null;

    int len = s.length();
    char[] buf = new char[len];
    s.getChars(0, len, buf, 0);
    for (int i=0; i<len; i++) {
        if (buf[i] >= 'A' && buf[i] <= 'Z')
            buf[i] += 0x20;
    }

    return new String(buf);
}

public static boolean containsIgnoreCaseAscii(String str, String searchStr) {
    return StringUtils.contains(lowerCaseAscii(str), lowerCaseAscii(searchStr));
}

Dave L.回答的一个问题是s2包含正则表达式标记,如\d等。

你想在s2上调用Pattern.quote():

Pattern.compile(Pattern.quote(s2), Pattern.CASE_INSENSITIVE).matcher(s1).find();

你可以使用

org.apache.commons.lang3.StringUtils.containsIgnoreCase("AbBaCca", "bac");

Apache Commons库对于这类事情非常有用。这个特殊的表达式可能比正则表达式更好,因为正则表达式在性能方面总是代价高昂。

我不确定你的主要问题是什么,但是是的,.contains是区分大小写的。

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

Pattern.compile(Pattern.quote(wantedStr), Pattern.CASE_INSENSITIVE).matcher(source).find();

编辑:如果s2包含regex特殊字符(其中有很多),首先引用它是很重要的。我已经更正了我的答案,因为这是人们看到的第一个答案,但是给马特·奎尔的答案投票,因为他指出了这一点。