Làm cách nào để kiểm tra xem một Chuỗi có chứa một Chuỗi khác theo cách không phân biệt chữ hoa chữ thường trong Java không?


386

Nói rằng tôi có hai chuỗi,

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

Tôi muốn thực hiện kiểm tra trả lại s2được chứa trong s1. Tôi có thể làm điều này với:

return s1.contains(s2);

Tôi khá chắc chắn rằng đó contains()là trường hợp nhạy cảm, tuy nhiên tôi không thể xác định điều này chắc chắn từ việc đọc tài liệu. Nếu đúng như vậy thì tôi cho rằng phương pháp tốt nhất của tôi sẽ là một cái gì đó như:

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

Tất cả điều này sang một bên, có cách nào khác (có thể tốt hơn) để thực hiện điều này mà không quan tâm đến phân biệt chữ hoa chữ thường?


DrJava sẽ là một cách cực kỳ dễ dàng để kiểm tra điều này khi tài liệu không làm bạn thất vọng. Chỉ cần nhập một vài trường hợp thử nghiệm vào cửa sổ Tương tác của nó và bạn sẽ tìm ra.
EfForEffort

17
Tôi nghĩ bạn đã trả lời câu hỏi của riêng bạn. Tôi không nghĩ bất kỳ giải pháp nào dưới đây tốt hơn giải pháp này. Nhưng họ chắc chắn là chậm hơn.
Nikolay Dimitrov

7
Giải pháp của bạn đơn giản hơn bất kỳ câu trả lời nào trong câu trả lời
Lobsterman

2
Câu trả lời tôi và nhiều người ở đây, đang tìm kiếm là trong câu hỏi của bạn.
Lalit Fauzdar

1
Ví dụ của bạn là cách đơn giản nhất, dễ đọc nhất và có lẽ là cách tốt nhất để làm điều này - tốt hơn bất kỳ câu trả lời nào tôi đang thấy.
dùng1258361

Câu trả lời:


320

Có, chứa là trường hợp nhạy cảm. Bạn có thể sử dụng java.util.regex.Potype với cờ CASE_INSENSITIVE để khớp không phân biệt chữ hoa chữ thường:

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

EDIT: Nếu s2 chứa các ký tự đặc biệt regex (trong đó có nhiều ký tự), điều quan trọng là phải trích dẫn nó trước. Tôi đã sửa câu trả lời của mình vì đây là lần đầu tiên mọi người sẽ nhìn thấy, nhưng hãy bỏ phiếu cho Matt Quail kể từ khi anh ấy chỉ ra điều này.


23
Như tài liệu đã nêu, tài liệu Pattern.CASE_INSENSITIVEnày chỉ hoạt động cho các ký tự ASCII (nghĩa là "" sẽ không khớp với "ä"). Một người cần phải xác định thêm UNICODE_CASEcờ để đạt được điều đó.
Philipp Wendler

72
phương pháp này sử dụng Patternnhiều hiệu suất hơn s1.toLowerCase().contains(s2.toLowerCase())?
Rajat Gupta

6
@ user01 Tôi đã thực hiện một phân tích tốc độ. Xem câu trả lời của tôi để biết kết quả (Tôi cũng đưa ra giải pháp nhanh hơn): stackoverflow.com/a/25379180/1705598
icza

10
Tôi sẽ rõ hơn những gì đang diễn ra nếu chúng ta có tên biến tốt hơn:Pattern.compile(Pattern.quote(needle), Pattern.CASE_INSENSITIVE).matcher(haystack).find()
John Bowers

5
@ user01 tính chính xác xuất hiện trước hiệu suất và sử dụng toLowerCase sẽ cho kết quả không chính xác (ví dụ: khi so sánh văn bản Hy Lạp nhất định có chứa chữ Sigma, có hai dạng chữ thường cho cùng một mẫu chữ hoa).
Klitos Kyriacou

266

Một vấn đề với câu trả lời của Dave L. là khi s2 chứa đánh dấu regex như \d, v.v.

Bạn muốn gọi Pattern.quote () trên s2:

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

1
Đẹp bắt Matt. Tôi tò mò muốn biết phương pháp nào hiệu quả hơn - chữ thường chứa hoặc giải pháp mẫu của bạn. Không sử dụng một mẫu kém hiệu quả hơn cho một so sánh đơn lẻ, nhưng hiệu quả hơn cho nhiều so sánh?
Aaron

41
Phương thức .toLowerCase (). Chứa () có thể sẽ nhanh hơn trong hầu hết các trường hợp. Tôi có lẽ cũng thích phong cách đó cho độ phức tạp thấp hơn.
Matt Quail

3
@AaronFerguson Vâng, thực sự, toLowerCase().contains()là nhanh hơn. Tôi đã thực hiện một số phân tích tốc độ, xem câu trả lời của tôi để biết kết quả: stackoverflow.com/a/25379180/1705598
icza

2
@MattQuail không có điểm nào nhanh hơn nếu nó không chính xác. Ví dụ: sigma vốn của Hy Lạp có hai dạng chữ thường (tùy thuộc vào việc nó có ở cuối từ hay không) và khi thử thực hiện khớp chuỗi con không phân biệt chữ hoa chữ thường, trong đó chuỗi con kết thúc bằng một sigma, bạn có thể dễ dàng nhận được sai các kết quả.
Klitos Kyriacou

Tôi nghĩ rằng chúng ta nên thêm Pattern.UNICODE_CASEcờ quá. Bạn có thể vui lòng xác nhận điều này?
Thariq Nugrohotomo 20/07/2016

160

Bạn có thể dùng

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

Các Apache Commons thư viện là rất hữu ích cho các loại điều này. Và điều đặc biệt này có thể tốt hơn các biểu thức thông thường vì regex luôn đắt về mặt hiệu suất.


1
Có ai biết nếu điều này tôn trọng miền địa phương?
Charles Wood

12
@CharlesWood Nó ủy nhiệm String.regionMatches, trong đó sử dụng chuyển đổi theo ký tự, nên không. Hơn nữa, containsIgnoreCase("ß", "ss")trả về -1, sai ở mọi địa phương (chữ "sharp" của Đức viết hoa thành "ss".
maaartinus

Đó sẽ là cách đúng đắn để so sánh các từ tiếng Đức sau đó? Dường như đó là một ngôn ngữ làm phức tạp mọi cách so sánh các chuỗi: P
chomp

1
BTW: ngôn ngữ tiếng Đức đã chính thức được mở rộng với số vốn ß vào năm 2017: de.wikipedia.org/wiki/Gro%C3%9Fes_%C3%9F . Trên bàn phím tiếng Đức, gõ Shift + Alt Gr + ß -> test: ẞ 😁
Kawu

119

Thực hiện nhanh hơn: Sử dụng String.regionMatches()

Sử dụng regrec có thể tương đối chậm. Nó (chậm) không thành vấn đề nếu bạn chỉ muốn kiểm tra trong một trường hợp. Nhưng nếu bạn có một mảng hoặc một bộ sưu tập hàng ngàn hoặc hàng trăm ngàn chuỗi, mọi thứ có thể trở nên khá chậm.

Giải pháp được trình bày dưới đây không sử dụng các biểu thức thông thường cũng không toLowerCase()(cũng chậm vì nó tạo ra một chuỗi khác và chỉ ném chúng đi sau khi kiểm tra).

Giải pháp xây dựng trên phương thức String.regionMatches () dường như chưa biết. Nó kiểm tra xem 2 Stringvùng có khớp nhau không, nhưng điều quan trọng là nó cũng có tình trạng quá tải với một ignoreCasetham số tiện dụng .

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

Phân tích tốc độ

Phân tích tốc độ này không có nghĩa là khoa học tên lửa, chỉ là một bức tranh sơ bộ về tốc độ của các phương pháp khác nhau.

Tôi so sánh 5 phương pháp.

  1. Phương thức chứaIgnoreCase () của chúng tôi .
  2. Bằng cách chuyển đổi cả hai chuỗi thành chữ thường và cuộc gọi String.contains().
  3. Bằng cách chuyển đổi chuỗi nguồn thành chữ thường và gọi String.contains()với chuỗi con được lưu trước, được lưu trong bộ đệm. Giải pháp này đã không linh hoạt vì nó kiểm tra một chuỗi con tiền thân.
  4. Sử dụng biểu thức chính quy (câu trả lời được chấp nhận Pattern.compile().matcher().find()...)
  5. Sử dụng biểu thức chính quy nhưng được tạo trước và lưu trữ Pattern. Giải pháp này đã không linh hoạt vì nó kiểm tra một chuỗi con được xác định trước.

Kết quả (bằng cách gọi phương thức 10 triệu lần):

  1. Phương pháp của chúng tôi: 670 ms
  2. 2x toLowerCase () và chứa (): 2829 ms
  3. 1x toLowerCase () và chứa () với chuỗi con được lưu trong bộ nhớ cache: 2446 ms
  4. Regapi: 7180 ms
  5. Regrec với bộ nhớ cache Pattern: 1845 ms

Kết quả trong một bảng:

                                            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

Phương pháp của chúng tôi nhanh hơn gấp 4 lần so với sử dụng và hạ thấp contains(), nhanh hơn gấp 10 lần so với sử dụng biểu thức thông thường và cũng nhanh hơn gấp 3 lần ngay cả khi Patternđược lưu trước bộ đệm (và mất tính linh hoạt khi kiểm tra chuỗi con tùy ý).


Phân tích mã kiểm tra

Nếu bạn quan tâm đến cách phân tích được thực hiện, đây là ứng dụng hoàn chỉnh có thể chạy được:

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 nhưng lưu ý rằng nó không thành công cho ß(chữ S sắc nét của Đức; viết hoa SS) và cả một số ký tự khác (xem nguồn của String.regionMatches, thử cả hai chuyển đổi).
maaartinus

2
Bạn luôn kiểm tra các chuỗi giống nhau, đây không thực sự là một so sánh công bằng. 'Tôi là' luôn ở giữa, điều này có thể hoặc không thể tạo ra sự khác biệt cho các phương pháp tìm kiếm khác nhau. Tốt hơn là tạo các chuỗi ngẫu nhiên và cũng báo cáo về tốc độ khi không có chuỗi con.

2
Điều đó dường như thực sự gần với phương thức StringUtils của Apache: grepcode.com/file/repo1.maven.org/maven2/org.apache.commons/ trộm
alain.janinm

1
@ alain.janinm Tôi không thấy điểm tương đồng. Điều duy nhất có vẻ "gần gũi" StringUtils.containsIgnoreCase()là cả giải pháp của tôi và Apache đều sử dụng một regionMatches()phương thức (trong một chu kỳ), nhưng ngay cả điều đó không giống như tôi gọi String.regionMatches()và các cuộc gọi Apache CharSequenceUtils.regionMatches().
icza

2
@icza CharSequenceUtils.regionMatcheschỉ gọi String.regionMatchesthực sự. Dù sao, quan điểm của tôi là cung cấp thông tin, rằng nếu ai đó đang sử dụng StringUtils lib, anh ta có thể gọi nó bởi vì đó có vẻ là một cách hiệu quả như bạn chứng minh bằng điểm chuẩn của mình. Nếu tôi không sử dụng Apache lib, tôi chắc chắn sẽ sử dụng phương thức của bạn;)
alain.janinm

22

Một cách đơn giản hơn để làm điều này (mà không phải lo lắng về việc khớp mẫu) sẽ chuyển đổi cả Strings thành chữ thường:

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

4
Trường hợp nhân vật phụ thuộc vào ngôn ngữ, có nghĩa là nó sẽ hoạt động trên máy tính của bạn nhưng sẽ thất bại cho khách hàng :). xem bình luận @Adriaan Koster.
kroiz

1
@kroiz, điều đó phụ thuộc vào việc String đến từ đâu. So sánh "foobar" và "FOO" sẽ luôn khớp, tuy nhiên nếu bạn đang so sánh thông tin đầu vào của người dùng hoặc nội dung dành riêng cho ngôn ngữ, thì bạn đã đúng - nhà phát triển nên thận trọng.
Phil

16

Vâng, điều này có thể đạt được:

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;

Mã này sẽ trả về Chuỗi "TRUE!" vì nó tìm thấy rằng các nhân vật của bạn được chứa.


12
Một nhược điểm lớn của việc sử dụng toLowerCase () là kết quả phụ thuộc vào Địa điểm hiện tại. Xem: javapapers.com/core-java/ từ
Adriaan Koster

4
Câu hỏi thực sự chứa một giải pháp tốt hơn vì câu hỏi này không thành công cho chữ thường s2. Không nói về những chi tiết như thế mà cái này không biên dịch và nếu có, nó sẽ trả về một chuỗi.
maaartinus


3

Đây là một số ứng dụng thân thiện với Unicode mà bạn có thể thực hiện nếu bạn sử dụng ICU4j. Tôi đoán "trường hợp bỏ qua" là nghi vấn cho các tên phương thức bởi vì mặc dù so sánh cường độ chính làm trường hợp bỏ qua, nó được mô tả là các chi tiết cụ thể phụ thuộc vào miền địa phương. Nhưng nó hy vọng phụ thuộc vào địa phương theo cách mà người dùng mong đợi.

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

Tôi đã làm một bài kiểm tra tìm một trường hợp không phân biệt chữ hoa chữ thường. Tôi có một Vector gồm 150.000 đối tượng với một Chuỗi là một trường và muốn tìm tập hợp con khớp với một chuỗi. Tôi đã thử ba phương pháp:

  1. Chuyển đổi tất cả sang chữ thường

    for (SongInformation song: songs) {
        if (song.artist.toLowerCase().indexOf(pattern.toLowercase() > -1) {
                ...
        }
    }
  2. Sử dụng phương thức String Match ()

    for (SongInformation song: songs) {
        if (song.artist.matches("(?i).*" + pattern + ".*")) {
        ...
        }
    }
  3. Sử dụng biểu thức thông thường

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

Kết quả thời gian là:

  • Không có kết quả phù hợp: 20 msecs

  • Để kết hợp thấp hơn: 182 msecs

  • Chuỗi khớp: 278 msecs

  • Biểu thức chính quy: 65 ms

Biểu thức chính quy có vẻ là nhanh nhất cho trường hợp sử dụng này.


Tốt là bạn đặt kết quả thời gian. Mọi người đều nói regex chậm như thế nào, nhưng thực tế nó rất nhanh nếu bạn chỉ phải biên dịch regex một lần.
woot

1

Có một cách ngắn gọn đơn giản, sử dụng cờ regex (trường hợp không nhạy {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

Tôi không chắc câu hỏi chính của bạn ở đây là gì, nhưng vâng, liên quan đến trường hợp nhạy cảm.


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

Về cơ bản, nó là một phương thức có hai chuỗi. Nó được coi là một phiên bản không phân biệt chữ hoa chữ thường của hàm chứa (). Khi sử dụng phương thức chứa, bạn muốn xem nếu một chuỗi được chứa trong chuỗi kia.

Phương thức này lấy chuỗi là "phụ" và kiểm tra xem nó có bằng chuỗi con của chuỗi chứa có độ dài bằng "phụ" không. Nếu bạn nhìn vào forvòng lặp, bạn sẽ thấy rằng nó lặp trong các chuỗi con (đó là độ dài của "phụ") trên chuỗi container.

Mỗi lần lặp kiểm tra để xem liệu chuỗi con của chuỗi container có thuộc về chuỗi equalsIgnoreCasecon không.


về cơ bản nó là một phương thức có hai chuỗi. nó được giả sử là một phiên bản không phân biệt chữ hoa chữ thường của hàm chứa (). Khi sử dụng phương thức chứa, bạn muốn xem nếu một chuỗi được chứa trong chuỗi kia. phương thức này lấy chuỗi là "phụ" và kiểm tra xem nó có bằng chuỗi con của chuỗi chứa không, có độ dài bằng với "phụ". Nếu bạn nhìn vào vòng lặp for, bạn sẽ thấy rằng nó lặp trong các chuỗi con (đó là độ dài của "phụ") trên chuỗi container. mỗi lần lặp kiểm tra xem chuỗi con của chuỗi container có bằng với chuỗi con không.
seth

@ Bạn có lẽ nên thêm nó vào câu trả lời của bạn.
Chàng trai với chiếc mũ

2
Đây là phương pháp chậm nhất từ ​​trước đến nay ... và cũng thất bại đối với người Đức.
maaartinus

0

Nếu bạn phải tìm kiếm một chuỗi ASCII trong một chuỗi ASCII khác, chẳng hạn như một URL , bạn sẽ thấy giải pháp của tôi tốt hơn. Tôi đã thử nghiệm phương pháp của icza và tốc độ của tôi và đây là kết quả:

  • Trường hợp 1 mất 2788 ms - areaMatches
  • Trường hợp 2 mất 1520 ms - của tôi

Mật mã:

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

    }

}

Cảm ơn bạn vì đoạn mã này, có thể cung cấp một số trợ giúp ngắn hạn có giới hạn. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ giúp nó hữu ích hơn cho những người đọc tương lai với những câu hỏi tương tự khác. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích, bao gồm các giả định bạn đã thực hiện.
Toby Speight

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

2
Bạn có thể cải thiện câu trả lời của mình bằng cách giải thích cách mã của bạn giải quyết vấn đề không?
Isuka

1
Câu trả lời này đã được đề xuất trong nhiều câu trả lời khác, chi tiết hơn cho câu hỏi này mà những người khác đã cung cấp. Tôi không nghĩ câu trả lời này phục vụ cho bất kỳ mục đích nào ở đây.
DaveyDaveDave

0

Chúng tôi có thể sử dụng luồng với anyMatch và chứa Java 8

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

hoặc bạn có thể sử dụng một cách tiếp cận đơn giản và chỉ cần chuyển đổi trường hợp của chuỗi thành trường hợp của chuỗi con và sau đó sử dụng phương thức chứa.


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

-1

Bạn chỉ có thể làm một cái gì đó như thế này:

String s1 = "AbBaCca";
String s2 = "bac";
String toLower = s1.toLowerCase();
return toLower.contains(s2);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.