在Java中,如何检查字符串是否包含子字符串(忽略大小写)?

tri*_*ity 513 java string substring

我有两个String,str1str2.如何检查是否str2包含在内str1,忽略大小写?

Igo*_*nov 1016

str1.toLowerCase().contains(str2.toLowerCase())
Run Code Online (Sandbox Code Playgroud)

  • 出于某种原因,当我打电话给"2014-03-25T17:55:00"时,我会变得虚假.contains("T") (7认同)
  • @RadijatoR是的,它被称为indexOf,如`int pos = str1.indexOf(str2)`或不区分大小写为`int pos = str1.toLowerCase().indexOf(str2.toLowerCase())` (6认同)
  • 是否有返回的函数和包含(str2)的位置? (3认同)
  • @JeremyList http://ideone.com/weYI1e,它会显示“ true”。 (2认同)

Jim*_*nor 127

怎么样matches()

String string = "Madam, I am Adam";

// Starts with
boolean  b = string.startsWith("Mad");  // true

// Ends with
b = string.endsWith("dam");             // true

// Anywhere
b = string.indexOf("I am") >= 0;        // true

// To ignore case, regular expressions must be used

// Starts with
b = string.matches("(?i)mad.*");

// Ends with
b = string.matches("(?i).*adam");

// Anywhere
b = string.matches("(?i).*i am.*");
Run Code Online (Sandbox Code Playgroud)

  • 您的"indexOf"示例应使用> = 0,而不是> 0,因为如果子字符串出现在字符串的开头,则0有效.(不是在你的例子中,但在其他情况下可以.)添加了这个响应,因为人们显然仍在搜索并找到这个答案. (14认同)

小智 32

如果你能够使用org.apache.commons.lang.StringUtils,我建议使用以下内容:

String container = "aBcDeFg";
String content = "dE";
boolean containerContainsContent = StringUtils.containsIgnoreCase(container, content);
Run Code Online (Sandbox Code Playgroud)


Vin*_*nie 21

您可以使用以下toLowerCase()方法:

public boolean contains( String haystack, String needle ) {
  haystack = haystack == null ? "" : haystack;
  needle = needle == null ? "" : needle;

  // Works, but is not the best.
  //return haystack.toLowerCase().indexOf( needle.toLowerCase() ) > -1

  return haystack.toLowerCase().contains( needle.toLowerCase() )
}
Run Code Online (Sandbox Code Playgroud)

然后用以下方法调用:

if( contains( str1, str2 ) ) {
  System.out.println( "Found " + str2 + " within " + str1 + "." );
}
Run Code Online (Sandbox Code Playgroud)

请注意,通过创建自己的方法,您可以重用它.然后,当有人指出你应该使用contains而不是indexOf,你只需要改变一行代码.

  • 记得在传递null对象时添加有关行为的Javadoc. (5认同)

小智 10

我也赞成RegEx解决方案.代码会更清晰.在我知道字符串变得很大的情况下,我会毫不犹豫地使用toLowerCase(),因为字符串是不可变的并且必须被复制.此外,matches()解决方案可能会令人困惑,因为它将正则表达式作为参数(搜索"Need $ le"冷却有问题).

基于上面的一些例子:

public boolean containsIgnoreCase( String haystack, String needle ) {
  if(needle.equals(""))
    return true;
  if(haystack == null || needle == null || haystack .equals(""))
    return false; 

  Pattern p = Pattern.compile(needle,Pattern.CASE_INSENSITIVE+Pattern.LITERAL);
  Matcher m = p.matcher(haystack);
  return m.find();
}

example call: 

String needle = "Need$le";
String haystack = "This is a haystack that might have a need$le in it.";
if( containsIgnoreCase( haystack, needle) ) {
  System.out.println( "Found " + needle + " within " + haystack + "." );
}
Run Code Online (Sandbox Code Playgroud)

(注意:根据您的需要,您可能希望以不同的方式处理NULL和空字符串.我认为我的方式更接近字符串的Java规范.)

速度关键解决方案可以包括通过字符迭代干草堆字符寻找针的第一个字符.当第一个字符匹配时(不区分大小写),开始逐个字符地迭代针,在大海捞针中查找相应的字符,如果所有字符都匹配则返回"true".如果遇到不匹配的字符,则通过下一个字符的haystack继续迭代,如果达到position> haystack.length() - needle.length()则返回"false".

  • 我会这样做:`Pattern.CASE_INSENSITIVE | Pattern.LITERAL` (2认同)

SOA*_*erd 7

我将使用contains方法和toUpper属于String类的方法的组合.一个例子如下:

String string1 = "AAABBBCCC"; 
String string2 = "DDDEEEFFF";
String searchForThis = "AABB";

System.out.println("Search1="+string1.toUpperCase().contains(searchForThis.toUpperCase()));

System.out.println("Search2="+string2.toUpperCase().contains(searchForThis.toUpperCase()));
Run Code Online (Sandbox Code Playgroud)

这将返回:

Search1 = true Search2
= false

  • 不行.转换为大写/小写时,一些奇怪的国际字符会转换为多个字符.例如:`"ß".toUpperCase().equals("SS")` (5认同)
  • 那就好了.这就是用德语写双s的方式. (2认同)