问答中心分类: JAVA在 Java 中,如何检查字符串是否包含子字符串(忽略大小写)? [复制]
0
匿名用户 提问 23分钟 前

这个问题在这里已经有了答案:

如何在Java中以不区分大小写的方式检查一个字符串是否包含另一个字符串?
(19 个回答)

关闭8 年前.

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

Stefan Kendall 回复 23分钟 前

indexOf 和 contains 都逐个字符进行,因此如果您需要更快的字符串搜索(您可以获得),那么您需要实现许多已发布的算法之一。

Stefan Kendall 回复 23分钟 前

我有同样的问题这里是答案:)stackoverflow.com/a/86832/621951

5 Answers
0
Jim Raynor 回答 23分钟 前

怎么样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.*");
Andrew Cottrell 回复 23分钟 前

您的“indexOf”示例应该使用 >= 0,而不是 > 0,因为如果子字符串出现在字符串的开头,则 0 是有效的。 (在您的示例中没有,但在其他情况下可以。)添加此响应,因为人们显然仍在搜索并找到此答案。

Michael 回复 23分钟 前

很好的答案!这真的很有用!

0
Mojo 回答 23分钟 前

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

String container = "aBcDeFg";
String content = "dE";
boolean containerContainsContent = StringUtils.containsIgnoreCase(container, content);
0
Vincent Ramdhanie 回答 23分钟 前

您可以使用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() )
}

然后使用以下命令调用它:

if( contains( str1, str2 ) ) {
  System.out.println( "Found " + str2 + " within " + str1 + "." );
}

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

Thorbjørn Ravn Andersen 回复 23分钟 前

请记住在传递空对象时添加有关行为的 Javadoc。

0
Michael Cooper 回答 23分钟 前

我也赞成 RegEx 解决方案。代码会干净得多。在我知道字符串会很大的情况下,我会犹豫使用 toLowerCase(),因为字符串是不可变的并且必须被复制。此外,matches() 解决方案可能会令人困惑,因为它需要一个正则表达式作为参数(搜索“Need$le”cold 是有问题的)。
基于上述一些示例:

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 + "." );
}

(注意:您可能希望根据需要以不同方式处理 NULL 和空字符串。我认为我拥有它的方式更接近于字符串的 Java 规范。)
速度关键的解决方案可能包括逐个字符地遍历大海捞针,寻找针的第一个字符。当第一个字符匹配时(不区分大小写),开始逐个字符地遍历针,在大海捞针中寻找相应的字符,如果所有字符都匹配,则返回“true”。如果遇到不匹配的字符,则在下一个字符处通过 haystack 继续迭代,如果达到 position > haystack.length() – needle.length(),则返回“false”。

mike jones 回复 23分钟 前

我会做:Pattern.CASE_INSENSITIVE|Pattern.LITERAL

KK_07k11A0585 回复 23分钟 前

@mikejones 我怎样才能只检查单词?考虑下面的情况 1) “这是一个干草堆,里面可能有针。”; 2)“这是一个干草堆,里面可能需要$lesss。”;我只希望匹配案例 1,因为在这种情况下需要 $le 作为单词存在。我不希望匹配第二种情况。我怎样才能做到这一点?

0
SOA Nerd 回答 23分钟 前

我会结合使用 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()));

这将返回:

搜索1=真
搜索2=假

Simon 回复 23分钟 前

不会工作。一些奇怪的国际字符在转换为小写/大写时会转换为多个字符。例如:"ß".toUpperCase().equals("SS")

James P. 回复 23分钟 前

那会算的。这就是双 s 用德语书写的方式。