2012-12-24 30 views
131

Dize str1="ABCDEFGHIJKLMNOP" bir dize deseni strptrn="gHi" içerip içermediğini belirlemek mümkün mü? Karakterlerin büyük/küçük harfe duyarlı olmaması durumunda bunun mümkün olup olmadığını bilmek istedim. Öyleyse nasıl?Dize içeriyor - yoksayma durumu

+1

toUpperCase() kullanıyor? – Ravi

cevap

195

Sen

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

Çekler CharSequence bir arama CharSequenc içeriyorsa durumundan bağımsız olarak, boş değer. Vaka duyarsızlığı String.equalsIgnoreCase (String) ile tanımlanır.

Sıfır CharSequence false değerini döndürür. regex performansı açısından daima pahalı olarak

Bu seferki regex daha iyi olacaktır. Resmi bir doküman

, başvurmak için: StringUtils.containsIgnoreCase

Güncelleme:

Eğer olanlar arasında ise kim

  • Apache commons kütüphaneye kullanmak istemiyorum
  • don pahalı regex/Pattern tabanlı çözümlerle gitmek istiyorum,
  • Eğer
    public boolean regionMatches(boolean ignoreCase, 
              int toffset, 
              String other, 
              int ooffset, 
              int len) 
    

    ignoreCasejava.lang.String.regionMatches

    kullanarak kendi özel containsIgnoreCase uygulayabilirsiniz, toLowerCase kullanarak

ek dize nesne oluşturmak istemiyoruz: karakterleri karşılaştırırken doğruysa, durum yok sayar.

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

Teşekkürler. İçinde indexOfIgnoreCase ... – vikingsteve

+6

gibi diğer güzel şeylerin bolluğu Bu yöntem, samanlığın eşleştirilmiş kısmının uzunluğunun, iğne uzunluğuyla aynı sayıda UTF-16 kod birimi olacağı varsayımını getirir. Yani "ß" için arama yaparsanız ve dizge "SS" içeriyorsa, bir eşleşme bulamaz, bu iki dizgenin durumu görmezden geldiğinizde aynı olmasına rağmen (Almanca yerel ayarında ve tabii ki Bu tür bir şey yaptığınızda yerel ayarı ayarlayın.) – Trejkaz

+3

org.apache.commons.lang3.StringUtils bu paket Android'de mevcut değildir –

21

Sen harf duyarsız eşleştirme için CASE_INSENSITIVE bayrağıyla java.util.regex.Pattern kullanabilirsiniz:

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

Önceki yanıta bakın: @SamStephens http://stackoverflow.com/a/6996550/372926 yazdı: hem CASE_INSENSITIVE hem de UNICODE_CASE belirtmelisiniz ve hala doğru değerleri alamayacaksınız, çünkü Java tam casemapping kullanıyorsa, Sadece basit bir kalıplama kullanır. Bu bir problem." – Vini

206

Eğer regex ile gitmeyecek olursa:

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

Bu bir cevap olsa da, büyük bir sorun değil" String's –

+17

Bu çok geniş bir unicode dünyasında çalışmıyor - bkz http://stackoverflow.com/a/6996550/ eğer 'gibi 372.926 – SamStephens

+1

(file.getName(). toLowerCase() \t \t \t \t \t \t .Contains (editText.getText(). toString(). toLowerCase())) önerildiği gibi' –

7

bu

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

Eğer hassas bir şekilde kontrol edilmek istenirse ve eğer isterseniz yanlış bir şekilde geçmek istiyorsanız, üçüncü parametre olarak geçiş yapın. duyarsız bir şekilde kontrol edilecek değer. –

1

Bir

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

Pattern.quote (strptrn) her zaman döndürür "\ Q" + s + "\ e" bile İmran Tarık'ın versiyonunu optimize deneyin orada alıntı yapmak için bir şey değil, konservasyon ganimet performansı.

+0

Bitwise kullanmalısınız | Ek operatör yerine operatör. –

İlgili konular