2012-12-24 113 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

您應該使用按位|運算符而不是加法運算符。 –