假设我有两个字符串,

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

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

return s1.contains(s2);

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

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

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


当前回答

你可以使用

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

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

其他回答

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

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

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

或者你可以使用一个简单的方法,将字符串的大小写转换为子字符串的大小写,然后使用contains方法。

你可以简单地这样做:

String s1 = "AbBaCca";
String s2 = "bac";
String toLower = s1.toLowerCase();
return toLower.contains(s2);

如果您导入ICU4j,可以创建一些unicode友好的代码。我认为“忽略大小写”对于方法名称来说是有问题的,因为尽管主要强度比较确实忽略大小写,但它被描述为具体内容依赖于区域设置。但希望它以用户期望的方式依赖于语言环境。

public static boolean containsIgnoreCase(String haystack, String needle) {
    return indexOfIgnoreCase(haystack, needle) >= 0;
}

public static int indexOfIgnoreCase(String haystack, String needle) {
    StringSearch stringSearch = new StringSearch(needle, haystack);
    stringSearch.getCollator().setStrength(Collator.PRIMARY);
    return stringSearch.first();
}
String x="abCd";
System.out.println(Pattern.compile("c",Pattern.CASE_INSENSITIVE).matcher(x).find());