2012-12-24 57 views
131

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

+1

使用toUpperCase()? – Ravi

回答

195

您可以使用

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

检查是否为CharSequence包含搜索CharSequenc不管 的情况如何,处理null。不区分大小写由 String.equalsIgnoreCase(String)定义。

null CharSequence将返回false。

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

对于官方的文档,请参阅:StringUtils.containsIgnoreCase

更新:

如果你是那些中谁

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

您可以使用java.lang.String.regionMatches

public boolean regionMatches(boolean ignoreCase, 
          int toffset, 
          String other, 
          int ooffset, 
          int len) 

ignoreCase实现自己的自定义containsIgnoreCase:如果属实,比较字符时忽略大小写。

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

谢谢。还有很多其他好东西,比如indexOfIgnoreCase ... – vikingsteve

+6

该方法假设干草堆的匹配部分的长度与针的长度相同,为UTF-16代码单元的数量。因此,如果您搜索“ß”并且字符串包含“SS”,它将不会找到匹配项,即使这两个字符串相同(如果您忽略大小写)(在德语语言环境中,当然,您必须) – Trejkaz

+3

org.apache.commons.lang3.StringUtils此包在android –

21

您可以使用java.util.regex.Pattern中与CASE_INSENSITIVE标志不区分大小写的匹配:

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

看看以前的答案@SamStephens写道http://stackoverflow.com/a/6996550/372926:您必须同时指定CASE_INSENSITIVE和UNICODE_CASE,并且仍然不会获得正确的值,因为虽然Java使用完整的casemapping,它只使用简单的表壳。这是个问题。“ – Vini

206

如果你不会用正则表达式去:

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

虽然这可能是一个答案,但我不认为这是一个很好的解决方案,大'字符串' –

+17

这不适用于广泛的unicode世界 - 请参阅http://stackoverflow.com/a/6996550/ 372926 – SamStephens

+1

类似'如果(file.getName()。toLowerCase() \t \t \t \t \t \t。载有(editText.getText()。的toString()。toLowerCase()))' –

7

试试这个

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

} 
+1

中不可用如果希望以区分大小写的方式检查值并在需要时传递false,则传递true作为第三个参数值以不区分大小写的方式进行检查。 –

1

优化的伊姆兰塔里克的版本

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

Pattern.quote(strptrn)总是返回 “\ Q” + S + “\ E” 即使有没有什么可以引用,连接破坏性能。

+0

您应该使用按位|运算符而不是加法运算符。 –