Bir Dize Java'da büyük / küçük harf duyarsız bir şekilde başka bir Dize içerip içermediğini nasıl kontrol edebilirim?


386

Diyelim ki iki telim var,

String s1 = "AbBaCca";
String s2 = "bac";

Bunu dönen bir çek gerçekleştirmek istediğiniz s2içinde bulunur s1. Bunu şu şekilde yapabilirim:

return s1.contains(s2);

Büyük / contains()küçük harfe duyarlı olduğundan eminim , ancak bunu belgeleri okuyarak kesin olarak belirleyemiyorum. Eğer öyleyse o zaman benim en iyi yöntem gibi bir şey olacağını varsayalım:

return s1.toLowerCase().contains(s2.toLowerCase());

Bütün bunlar bir yana, bunu büyük / küçük harfe duyarlılık olmadan önemsemenin başka bir (muhtemelen daha iyi) yolu var mı?


DrJava , belgeleriniz başarısız olduğunda bunu test etmenin son derece kolay bir yolu olacaktır. Etkileşimler penceresine birkaç test örneği yazmanız yeterlidir.
EfForEffort

17
Sanırım kendi sorunuzu cevapladınız. Aşağıdaki çözümlerin hiçbirinin bundan daha iyi olduğunu düşünmüyorum. Ama kesinlikle daha yavaşlar.
Nikolay Dimitrov

7
Çözümünüz cevaplardakinden daha basit
LobsterMan

2
Ben ve birçoğunun aradığı cevap sizin sorunuzda.
Lalit Fauzdar

1
Örneğin, bunu yapmanın en basit, en okunaklı ve muhtemelen en iyi yolu - gördüğüm cevaplardan daha iyi.
user1258361

Yanıtlar:


320

Evet, büyük / küçük harf duyarlıdır. Büyük / küçük harfe duyarlı olmayan eşleme için java.util.regex.Pattern öğesini CASE_INSENSITIVE bayrağıyla birlikte kullanabilirsiniz:

Pattern.compile(Pattern.quote(wantedStr), Pattern.CASE_INSENSITIVE).matcher(source).find();

DÜZENLEME: Eğer s2 regex özel karakterleri içeriyorsa (bunlardan birçoğu vardır) önce alıntı yapmanız önemlidir. Cevabımı düzelttim, çünkü insanların göreceği ilk kişi bu oldu, ama Matt Quail'in oy verdiğinden beri oy kullandı.


23
İçin belgelerde belirtildiği gibi Pattern.CASE_INSENSITIVE, bu yalnızca ASCII karakterleri için geçerlidir (yani "Ä" "ä" ile eşleşmez). Buna ek olarak, UNICODE_CASEbayrağın bunu başarmak için belirtilmesi gerekir.
Philipp Wendler

72
Bu yaklaşım Patterndaha fazla performans s1.toLowerCase().contains(s2.toLowerCase())mı kullanıyor ?
Rajat Gupta

6
@ user01 Bir hız analizi yaptım. Sonuçlar için cevabımı görün (daha hızlı bir çözüm de gösterdim): stackoverflow.com/a/25379180/1705598
icza

10
Daha iyi değişken isimlerimiz olsaydı neler olduğunu daha net bir şekilde Pattern.compile(Pattern.quote(needle), Pattern.CASE_INSENSITIVE).matcher(haystack).find()
John Bowers

5
@ user01 doğruluğu performanstan önce gelir ve toLowerCase kullanmak potansiyel olarak yanlış sonuçlar verir (örneğin, aynı büyük harf formu için iki küçük forma sahip olan Sigma harfini içeren belirli Yunanca metinleri karşılaştırırken).
Klitos Kyriacou

266

Dave L.'nin cevabındaki bir sorun, s2'nin \d, vb. Gibi regex işaretlemesi içermesidir .

S2'de Pattern.quote () işlevini çağırmak istiyorsunuz:

Pattern.compile(Pattern.quote(s2), Pattern.CASE_INSENSITIVE).matcher(s1).find();

1
Güzel yakalamak Matt. Hangi yöntemin daha verimli olduğunu merak ediyorum - küçük harf içeriyor veya desen çözümünüz. Bir deseni tek bir karşılaştırma için daha az verimli değil, birden çok karşılaştırma için daha verimli mi kullanıyorsunuz?
Aaron

41
.ToLowerCase (). İnclude () yöntemi çoğu durumda daha hızlı olacaktır. Muhtemelen bu stili daha düşük karmaşıklık için de tercih ederim.
Matt Quail

3
@AaronFerguson Evet, gerçekten toLowerCase().contains()daha hızlı. Biraz hız analizi yaptım, sonuçlar için cevabımı görüyorum: stackoverflow.com/a/25379180/1705598
icza

2
@MattQuail yanlış olması durumunda daha hızlı olmasının bir anlamı yok. Örneğin, Yunan sermayesi sigmasının iki küçük harfi vardır (bir kelimenin sonunda olup olmamasına bağlı olarak) ve alt dizenin bir sigma ile bittiği durumda büyük / küçük harfe duyarlı olmayan alt dize eşleşmesi yapmaya çalıştığınızda, kolayca yanlış olabilirsiniz Sonuçlar.
Klitos Kyriacou

Bence Pattern.UNICODE_CASEbayrak da eklemeliyiz . Lütfen bunu onaylar mısınız?
Thariq Nugrohotomo

160

Kullanabilirsiniz

org.apache.commons.lang3.StringUtils.containsIgnoreCase("AbBaCca", "bac");

Apache Commons kütüphane bu tür bir şey için çok yararlıdır. Regex performans açısından her zaman pahalı olduğundan, bu özel ifade normal ifadelerden daha iyi olabilir.


1
Bunun yerel ayarlara saygı gösterip göstermediğini bilen var mı?
Charles Wood

12
@CharlesWood String.regionMatchesKarakter bazında dönüşümler kullanan temsilciler , bu yüzden hayır. Ayrıca, containsIgnoreCase("ß", "ss")her yerel ayarda yanlış olan -1 değerini döndürür (Almanca "keskin s", "ss" olarak büyük harf kullanır.
maaartinus

Almanca kelimeleri karşılaştırmanın doğru yolu hangisidir? Bu, dizeleri karşılaştırmanın her yolunu karmaşıklaştıran bir dildir: P
chomp

1
BTW: Alman dili resmi olarak 2017 yılında ß sermayesi ile genişletildi: de.wikipedia.org/wiki/Gro%C3%9Fes_%C3%9F . Alman klavyelerde, tip Shift + Alt Gr + ß -> Test: ẞ 😁
Kawu

119

Daha Hızlı Bir Uygulama: Yararlanma String.regionMatches()

Normal ifade kullanmak nispeten yavaş olabilir. Sadece bir durumda kontrol etmek isteyip istemediğiniz önemli değildir. Ancak binlerce veya yüz binlerce dizeden oluşan bir diziniz veya koleksiyonunuz varsa, işler oldukça yavaşlayabilir.

Aşağıda sunulan çözüm ne düzenli ifadeler ne de kullanmaktadır toLowerCase()(bu da yavaştır çünkü başka bir karakter dizisi oluşturur ve bunları çekten sonra atar).

Çözüm bilinmeyen String.regionMatches () yöntemi üzerine kuruludur . 2 Stringbölgenin eşleşip eşleşmediğini kontrol eder , ancak önemli olan kullanışlı bir ignoreCaseparametreyle aşırı yüke sahip olmasıdır .

public static boolean containsIgnoreCase(String src, String what) {
    final int length = what.length();
    if (length == 0)
        return true; // Empty string is contained

    final char firstLo = Character.toLowerCase(what.charAt(0));
    final char firstUp = Character.toUpperCase(what.charAt(0));

    for (int i = src.length() - length; i >= 0; i--) {
        // Quick check before calling the more expensive regionMatches() method:
        final char ch = src.charAt(i);
        if (ch != firstLo && ch != firstUp)
            continue;

        if (src.regionMatches(true, i, what, 0, length))
            return true;
    }

    return false;
}

Hız analizi

Bu hız analizi, roket bilimi anlamına gelmez, sadece farklı yöntemlerin ne kadar hızlı olduğuna dair kaba bir tablo.

5 yöntemi karşılaştırıyorum.

  1. Bizim containsIgnoreCase () yöntemi.
  2. Her iki dizeyi de küçük harfe ve aramaya dönüştürerek String.contains().
  3. Kaynak dizgisini küçük harfe dönüştürerek ve String.contains()önbelleğe alınmış, alt kasalı alt dize ile çağrı yaparak. Bu çözüm zaten bir esnek alt dizeyi test ettiği için esnek değildir.
  4. Normal ifadeyi kullanma (kabul edilen cevap Pattern.compile().matcher().find()...)
  5. Düzenli ifade kullanmak, ancak önceden oluşturulmuş ve önbelleğe alınmış olarak Pattern. Bu çözüm zaten önceden tanımlanmış bir alt dizeyi test ettiği için esnek değildir.

Sonuçlar (yöntemi 10 milyon kez çağırarak):

  1. Bizim yöntemimiz: 670 ms
  2. 2x toLowerCase () ve şunu içerir (): 2829 ms
  3. 1x toLowerCase () ve önbelleğe alınmış alt dize içeren () içerir: 2446 ms
  4. Normal ifade: 7180 ms
  5. Önbelleğe alınmış normal ifade Pattern: 1845 ms

Bir tablodaki sonuçlar:

                                            RELATIVE SPEED   1/RELATIVE SPEED
 METHOD                          EXEC TIME    TO SLOWEST      TO FASTEST (#1)
------------------------------------------------------------------------------
 1. Using regionMatches()          670 ms       10.7x            1.0x
 2. 2x lowercase+contains         2829 ms        2.5x            4.2x
 3. 1x lowercase+contains cache   2446 ms        2.9x            3.7x
 4. Regexp                        7180 ms        1.0x           10.7x
 5. Regexp+cached pattern         1845 ms        3.9x            2.8x

Bizim yöntemimiz, küçük harflere ve kullanıma göre 4 kat daha hızlıcontains() , normal ifadeleri kullanmaya kıyasla 10 kat daha hızlı ve önbelleğe alınmış olsa bile 3 kat daha hızlıPattern (ve keyfi bir alt dizeyi denetleme esnekliğini kaybetme).


Analiz Test Kodu

Analizin nasıl yapıldığıyla ilgileniyorsanız, çalıştırılabilir uygulamanın tamamı şöyledir:

import java.util.regex.Pattern;

public class ContainsAnalysis {

    // Case 1 utilizing String.regionMatches()
    public static boolean containsIgnoreCase(String src, String what) {
        final int length = what.length();
        if (length == 0)
            return true; // Empty string is contained

        final char firstLo = Character.toLowerCase(what.charAt(0));
        final char firstUp = Character.toUpperCase(what.charAt(0));

        for (int i = src.length() - length; i >= 0; i--) {
            // Quick check before calling the more expensive regionMatches()
            // method:
            final char ch = src.charAt(i);
            if (ch != firstLo && ch != firstUp)
                continue;

            if (src.regionMatches(true, i, what, 0, length))
                return true;
        }

        return false;
    }

    // Case 2 with 2x toLowerCase() and contains()
    public static boolean containsConverting(String src, String what) {
        return src.toLowerCase().contains(what.toLowerCase());
    }

    // The cached substring for case 3
    private static final String S = "i am".toLowerCase();

    // Case 3 with pre-cached substring and 1x toLowerCase() and contains()
    public static boolean containsConverting(String src) {
        return src.toLowerCase().contains(S);
    }

    // Case 4 with regexp
    public static boolean containsIgnoreCaseRegexp(String src, String what) {
        return Pattern.compile(Pattern.quote(what), Pattern.CASE_INSENSITIVE)
                    .matcher(src).find();
    }

    // The cached pattern for case 5
    private static final Pattern P = Pattern.compile(
            Pattern.quote("i am"), Pattern.CASE_INSENSITIVE);

    // Case 5 with pre-cached Pattern
    public static boolean containsIgnoreCaseRegexp(String src) {
        return P.matcher(src).find();
    }

    // Main method: perfroms speed analysis on different contains methods
    // (case ignored)
    public static void main(String[] args) throws Exception {
        final String src = "Hi, I am Adam";
        final String what = "i am";

        long start, end;
        final int N = 10_000_000;

        start = System.nanoTime();
        for (int i = 0; i < N; i++)
            containsIgnoreCase(src, what);
        end = System.nanoTime();
        System.out.println("Case 1 took " + ((end - start) / 1000000) + "ms");

        start = System.nanoTime();
        for (int i = 0; i < N; i++)
            containsConverting(src, what);
        end = System.nanoTime();
        System.out.println("Case 2 took " + ((end - start) / 1000000) + "ms");

        start = System.nanoTime();
        for (int i = 0; i < N; i++)
            containsConverting(src);
        end = System.nanoTime();
        System.out.println("Case 3 took " + ((end - start) / 1000000) + "ms");

        start = System.nanoTime();
        for (int i = 0; i < N; i++)
            containsIgnoreCaseRegexp(src, what);
        end = System.nanoTime();
        System.out.println("Case 4 took " + ((end - start) / 1000000) + "ms");

        start = System.nanoTime();
        for (int i = 0; i < N; i++)
            containsIgnoreCaseRegexp(src);
        end = System.nanoTime();
        System.out.println("Case 5 took " + ((end - start) / 1000000) + "ms");
    }

}

6
+1 ancak başarısız olduğunu ß(Alman keskin S; büyük harfle yazıyor SS) ve diğer bazı karakterler için de ( String.regionMatchesher iki dönüşümü de deneyen kaynağa bakın ) unutmayın.
maaartinus

2
Her zaman aynı dizeleri test eder, ki bu gerçekten adil bir karşılaştırma değildir. 'Ben'im her zaman ortadadır, bu da farklı arama yöntemleri için fark yaratabilir veya yaratmayabilir. Rastgele dizeler oluşturmak ve ayrıca bir alt dize olmadığında hızı raporlamak daha iyi olur.

2
Bu, Apache StringUtils yöntemine gerçekten yakın görünüyor: grepcode.com/file/repo1.maven.org/maven2/org.apache.commons/…
alain.janinm

1
@ alain.janinm Benzerlikleri göremiyorum. "Yakın" gibi görünen tek şey, StringUtils.containsIgnoreCase()hem çözümümün hem de Apache'nin bir regionMatches()yöntem (bir döngüde) kullanmasıdır, ancak bu bile aradığım String.regionMatches()ve Apache çağrılarıyla aynı değildir CharSequenceUtils.regionMatches().
icza

2
@icza CharSequenceUtils.regionMatchessadece çağırıyor String.regionMatches. Her neyse, benim açımdan bilgi vermekti, eğer birisi zaten StringUtils lib kullanıyorsa, sadece kıyaslama yapabileceğiniz gibi etkili bir yol gibi göründüğü için onu çağırabilir. Apache lib kullanmıyorsam, yönteminizi kesinlikle kullanırdım;)
alain.janinm

22

Bunu yapmanın daha basit bir yolu (desen eşleşmesi konusunda endişelenmeden) her iki Strings'yi de küçük harfe dönüştürmek olacaktır :

String foobar = "fooBar";
String bar = "FOO";
if (foobar.toLowerCase().contains(bar.toLowerCase()) {
    System.out.println("It's a match!");
}

4
Karakter durumu dile bağlıdır, yani bilgisayarınızda çalışır ancak müşteri için başarısız olur :). @Adriaan Koster yorumuna bakın.
kroiz

1
@kroiz, Dizenin nereden geldiğine bağlıdır. "Foobar" ve "FOO" karşılaştırması her zaman eşleşir, ancak kullanıcı giriş bilgilerini veya dile özgü içeriği karşılaştırıyorsanız, haklısınız - bir geliştirici dikkatli olmalıdır.
Phil

16

Evet, bu gerçekleştirilebilir:

String s1 = "abBaCca";
String s2 = "bac";

String s1Lower = s1;

//s1Lower is exact same string, now convert it to lowercase, I left the s1 intact for print purposes if needed

s1Lower = s1Lower.toLowerCase();

String trueStatement = "FALSE!";
if (s1Lower.contains(s2)) {

    //THIS statement will be TRUE
    trueStatement = "TRUE!"
}

return trueStatement;

Bu kod "TRUE!" Dizesini döndürür karakterlerinizin bulunduğunu tespit etti.


12
ToLowerCase () kullanmanın en büyük dezavantajı, sonucun geçerli Yerel Ayar'a bağlı olmasıdır. Bkz: javapapers.com/core-java/…
Adriaan Koster

4
Bu soru aslında daha küçük bir çözüm için başarısız olduğundan daha iyi bir çözüm içermektedir s2. Böyle bir ayrıntıdan bahsetmemek, bu derlenmez ve eğer olsaydı, bir dize döndürür.
maaartinus


3

İşte ICU4j'yi çekerseniz yapabileceğiniz bazı Unicode dostu olanları. Bence "görmezden gelme" yöntem adları için sorgulanabilir çünkü birincil güç karşılaştırmaları durumu görmezden gelse de, bu özellik yerel ayarlara bağımlı olarak tanımlanır. Ancak umarım kullanıcının beklediği şekilde yerel ayara bağlıdır.

public static boolean containsIgnoreCase(String haystack, String needle) {
    return indexOfIgnoreCase(haystack, needle) >= 0;
}

public static int indexOfIgnoreCase(String haystack, String needle) {
    StringSearch stringSearch = new StringSearch(needle, haystack);
    stringSearch.getCollator().setStrength(Collator.PRIMARY);
    return stringSearch.first();
}

3

Bir dizenin büyük / küçük harfe duyarlı olmayan bir eşleşmesini bulmak için bir test yaptım. Bir alan olarak bir String ile tüm 150.000 nesnelerin bir Vektör var ve bir dize eşleşen alt kümesini bulmak istedim. Üç yöntem denedim:

  1. Tümünü küçük harfe dönüştür

    for (SongInformation song: songs) {
        if (song.artist.toLowerCase().indexOf(pattern.toLowercase() > -1) {
                ...
        }
    }
  2. String match () yöntemini kullanma

    for (SongInformation song: songs) {
        if (song.artist.matches("(?i).*" + pattern + ".*")) {
        ...
        }
    }
  3. Normal ifadeler kullanın

    Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher("");
    for (SongInformation song: songs) {
        m.reset(song.artist);
        if (m.find()) {
        ...
        }
    }

Zamanlama sonuçları:

  • Eşleşme denenmedi: 20 milisaniye

  • Eşleşmeyi düşürmek için: 182 milisaniye

  • Dizi eşleşmeleri: 278 msn

  • Normal ifade: 65 milisaniye

Normal ifade, bu kullanım durumu için en hızlı gibi görünmektedir.


Zamanlama sonuçları koymanız iyi olur. Herkes normal regex'in ne kadar yavaş olduğunu söylüyor, ancak gerçekte regex'i sadece bir kez derlemeniz çok hızlı.
woot

1

Normal ifade bayrağını kullanmanın basit ve özlü bir yolu vardır (büyük / küçük harf duyarsız {i}):

 String s1 = "hello abc efg";
 String s2 = "ABC";
 s1.matches(".*(?i)"+s2+".*");

/*
 * .*  denotes every character except line break
 * (?i) denotes case insensitivity flag enabled for s2 (String)
 * */

0

Burada ana sorunuzun ne olduğundan emin değilim, ama evet, .contains büyük / küçük harfe duyarlıdır.


0
String container = " Case SeNsitive ";
String sub = "sen";
if (rcontains(container, sub)) {
    System.out.println("no case");
}

public static Boolean rcontains(String container, String sub) {

    Boolean b = false;
    for (int a = 0; a < container.length() - sub.length() + 1; a++) {
        //System.out.println(sub + " to " + container.substring(a, a+sub.length()));
        if (sub.equalsIgnoreCase(container.substring(a, a + sub.length()))) {
            b = true;
        }
    }
    return b;
}

Temel olarak, iki dize alan bir yöntemdir. Bu, include () öğesinin büyük / küçük harfe duyarlı olmayan bir sürümü olması gerekir. İnclude yöntemini kullanırken, bir dizenin diğerinde bulunup bulunmadığını görmek istersiniz.

Bu yöntem, "sub" olan dizeyi alır ve "dize" uzunluğuna eşit olan konteyner dizesinin alt dizelerine eşit olup olmadığını denetler. Eğer bakarsanızfor , kabın dize üzerinde alt dizelerde ("alt" uzunluğu) yinelendiğini görürsünüz.

Her yineleme, konteyner dizesinin equalsIgnoreCasealt dizesinin alt için olup olmadığını kontrol eder .


temelde iki dize alan bir yöntemdir. include () öğesinin büyük / küçük harfe duyarlı olmayan bir sürümü olduğunu varsayalım. include yöntemini kullanırken, bir dizenin diğerinde bulunup bulunmadığını görmek istersiniz. bu yöntem "sub" dizesini alır ve "dize" uzunluğuna eşit olan konteyner dizesinin alt dizelerine eşit olup olmadığını kontrol eder. for döngüsüne bakarsanız, bunun konteyner dizesi üzerinde alt dizelerde ("alt" uzunluğu) yinelendiğini görürsünüz. her yineleme, kap dizesinin alt dizesinin alt dizine eşit olup olmadığını kontrol eder.
seth

@Bunu muhtemelen cevabınıza eklemelisiniz.
Şapkalı Adam

2
Bu şimdiye kadarki en yavaş yöntem ... ve aynı zamanda Almanca için de başarısız oluyor.
maaartinus

0

URL gibi başka bir ASCII dizesinde bir ASCII dizesi aramak zorunda kalırsanız, çözümümün daha iyi olduğunu görürsünüz. Hız için icza'nın yöntemini ve benimkini test ettim ve işte sonuçlar:

  • Vaka 1 2788 ms aldı - region
  • Vaka 2 1520 ms sürdü - benim

Kod:

public static String lowerCaseAscii(String s) {
    if (s == null)
        return null;

    int len = s.length();
    char[] buf = new char[len];
    s.getChars(0, len, buf, 0);
    for (int i=0; i<len; i++) {
        if (buf[i] >= 'A' && buf[i] <= 'Z')
            buf[i] += 0x20;
    }

    return new String(buf);
}

public static boolean containsIgnoreCaseAscii(String str, String searchStr) {
    return StringUtils.contains(lowerCaseAscii(str), lowerCaseAscii(searchStr));
}

0
import java.text.Normalizer;

import org.apache.commons.lang3.StringUtils;

public class ContainsIgnoreCase {

    public static void main(String[] args) {

        String in = "   Annulée ";
        String key = "annulee";

        // 100% java
        if (Normalizer.normalize(in, Normalizer.Form.NFD).replaceAll("[\\p{InCombiningDiacriticalMarks}]", "").toLowerCase().contains(key)) {
            System.out.println("OK");
        } else {
            System.out.println("KO");
        }

        // use commons.lang lib
        if (StringUtils.containsIgnoreCase(Normalizer.normalize(in, Normalizer.Form.NFD).replaceAll("[\\p{InCombiningDiacriticalMarks}]", ""), key)) {
            System.out.println("OK");
        } else {
            System.out.println("KO");
        }

    }

}

Kısa süreli sınırlı yardım sağlayabilecek bu kod snippet'i için teşekkür ederiz. Uygun bir açıklama , bunun neden problem için iyi bir çözüm olduğunu göstererek uzun vadeli değerini büyük ölçüde artıracak ve diğer benzer sorularla gelecekteki okuyucular için daha yararlı hale getirecektir. Yaptığınız varsayımlar dahil bazı açıklamalar eklemek için lütfen yanıtınızı düzenleyin .
Toby Speight

0
"AbCd".toLowerCase().contains("abcD".toLowerCase())

2
Kodunuzun sorunu nasıl çözdüğünü açıklayarak yanıtınızı geliştirebilir misiniz?
Isuka

1
Bu cevap, başkalarının sağladığı bu soruya daha ayrıntılı, daha ayrıntılı cevaplarda zaten önerilmiştir. Bu cevabın burada herhangi bir amaca hizmet ettiğini düşünmüyorum.
DaveyDaveDave

0

Akışını anyMatch ile kullanabiliriz ve Java 8'i içerir

public class Test2 {
    public static void main(String[] args) {

        String a = "Gina Gini Protijayi Soudipta";
        String b = "Gini";

        System.out.println(WordPresentOrNot(a, b));
    }// main

    private static boolean WordPresentOrNot(String a, String b) {
    //contains is case sensitive. That's why change it to upper or lower case. Then check
        // Here we are using stream with anyMatch
        boolean match = Arrays.stream(a.toLowerCase().split(" ")).anyMatch(b.toLowerCase()::contains);
        return match;
    }

}

0

ya da basit bir yaklaşım kullanabilir ve dizenin büyük / küçük harfini alt dize büyük / küçük harf büyüklüğüne dönüştürebilir ve daha sonra include yöntemi kullanabilirsiniz.


-1
String x="abCd";
System.out.println(Pattern.compile("c",Pattern.CASE_INSENSITIVE).matcher(x).find());

-1

Sadece böyle bir şey yapabilirsiniz:

String s1 = "AbBaCca";
String s2 = "bac";
String toLower = s1.toLowerCase();
return toLower.contains(s2);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.