जावा में असंवेदनशील तरीके से एक स्ट्रिंग में एक और स्ट्रिंग शामिल है, तो कैसे जांचें?


386

कहो मेरे पास दो तार हैं,

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

मैं एक चेक रिटर्निंग करना चाहता हूं जो s2भीतर निहित है s1। मैं इसके साथ कर सकता हूं:

return s1.contains(s2);

मुझे पूरा यकीन है कि contains()यह मामला संवेदनशील है, हालाँकि मैं इसे दस्तावेज़ पढ़ने से सुनिश्चित नहीं कर सकता। अगर ऐसा है तो मुझे लगता है कि मेरी सबसे अच्छी विधि कुछ इस तरह होगी:

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

यह सब एक तरफ, क्या मामला-संवेदनशीलता की परवाह किए बिना इसे पूरा करने का एक और (संभवतः बेहतर) तरीका है?


DrJava यह परीक्षण करने के लिए एक बहुत ही आसान तरीका होगा जब प्रलेखन आपको विफल करता है। बस इसके इंटरैक्शन विंडो में परीक्षण मामलों के एक जोड़े को टाइप करें, और आपको पता लगाना चाहिए।
एफफोरएफ़ॉर्ट

17
मुझे लगता है कि आपने अपने प्रश्न का उत्तर दे दिया है। मुझे नहीं लगता कि नीचे दिए गए कोई भी समाधान इससे बेहतर हैं। लेकिन वे निश्चित रूप से धीमे हैं।
निकोले दिमित्रोव

7
आपका समाधान उत्तर में किसी भी व्यक्ति की तुलना में सरल है
लॉबस्टरमैन

2
जवाब मैं और यहाँ कई, आपके प्रश्न में है।
ललित फौजदार

1
आपका उदाहरण सबसे सरल, सबसे पठनीय और संभवतः ऐसा करने का सबसे अच्छा तरीका है - मेरे द्वारा देखे जा रहे किसी भी उत्तर से बेहतर।
user1258361

जवाबों:


320

हां, मामला संवेदनशील है। आप असंवेदनशील मामले के लिए CASE_INSENSITIVE ध्वज के साथ java.util.regex.Pattern का उपयोग कर सकते हैं:

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

संपादित करें: यदि s2 में regex विशेष वर्ण हैं (जिनमें से कई हैं) तो इसे पहले उद्धृत करना महत्वपूर्ण है। मैंने अपना उत्तर सही कर दिया है क्योंकि यह पहला व्यक्ति है जो देखेगा, लेकिन उसने मैट क्वेल को वोट दिया क्योंकि उसने यह बताया।


23
जैसा कि प्रलेखन द्वारा कहा गया है Pattern.CASE_INSENSITIVE, यह केवल ASCII वर्णों के लिए काम करता है (यानी, "won't" "ä" से मेल नहीं खाएगा)। इसके अलावा UNICODE_CASEध्वज को प्राप्त करने के लिए ध्वज को निर्दिष्ट करने की आवश्यकता है।
फिलिप वेंडलर

72
की Patternतुलना में अधिक प्रदर्शन का उपयोग कर इस दृष्टिकोण है s1.toLowerCase().contains(s2.toLowerCase())?
रजत गुप्ता

6
@ user01 मैंने गति विश्लेषण किया। परिणामों के लिए मेरा उत्तर देखें (मैंने भी एक तेज़ समाधान दिखाया): stackoverflow.com/a/25379180/1705598
icza

10
यह मुझे और स्पष्ट करेगा कि अगर हमारे पास बेहतर चर नाम हों तो क्या होगा:Pattern.compile(Pattern.quote(needle), Pattern.CASE_INSENSITIVE).matcher(haystack).find()
जॉन बोवर्स

5
@ user01 शुद्धता प्रदर्शन से पहले आती है, और tolowerCase का उपयोग संभावित रूप से गलत परिणाम देगा (उदाहरण के लिए, जब कुछ ग्रीक पाठ जिसमें सिग्मा अक्षर, एक ही अपरकेस फॉर्म के लिए दो लोअरकेस फॉर्म की तुलना करते हैं)।
क्लिटोस काइराकौ

266

डेव एल द्वारा जवाब के साथ एक समस्या यह है कि s2 में रेगेक्स मार्कअप है जैसे कि \d, आदि।

आप s2 पर Pattern.quote () को कॉल करना चाहते हैं:

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

1
अच्छा कैच मैट। मैं यह जानने के लिए उत्सुक हूं कि कौन सी विधि अधिक कुशल है - निचले हिस्से में या आपके पैटर्न का समाधान है। एक तुलना के लिए एक पैटर्न कम कुशल का उपयोग नहीं कर रहा है, लेकिन कई तुलनाओं के लिए अधिक कुशल है?
हारून

41
.ToLowerCase () शामिल हैं () विधि ज्यादातर मामलों में संभवत: तेज होगी। मैं शायद कम जटिलता के लिए उस शैली को पसंद करूंगा।
मैट क्वेल

3
@AaronFerguson हां, वास्तव में, toLowerCase().contains()तेज है। मैंने कुछ गति विश्लेषण किए, परिणामों के लिए मेरा उत्तर देखें: stackoverflow.com/a/25379180/1705598
icza

2
@MattQuail का कोई मतलब नहीं है अगर तेजी से गलत हो सकता है। उदाहरण के लिए, ग्रीक राजधानी सिग्मा में दो लोअरकेस फॉर्म होते हैं (यह निर्भर करता है कि यह एक शब्द के अंत में आता है या नहीं) और जब केस-असंवेदनशील प्रतिस्थापन मैच करने का प्रयास किया जाता है, जहां विकल्प एक सिग्मा के साथ समाप्त होता है, तो आप आसानी से गलत हो सकते हैं। परिणाम है।
क्लिटोस काइराकौ

मुझे लगता है कि हमें Pattern.UNICODE_CASEभी झंडा जोड़ना चाहिए । क्या आप इसकी पुष्टि कर सकते हैं?
थारिक नुगरोहोतो

160

आप उपयोग कर सकते हैं

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

अपाचे कॉमन्स पुस्तकालय बात की इस तरह के लिए बहुत उपयोगी है। और यह विशेष रूप से नियमित अभिव्यक्तियों से बेहतर हो सकता है क्योंकि प्रदर्शन के मामले में रेगेक्स हमेशा महंगा होता है।


1
क्या किसी को पता है कि क्या यह स्थानीय लोगों का सम्मान करता है?
चार्ल्स वुड

12
@CharlesWood यह दर्शाता है String.regionMatches, जो चरित्र-वार रूपांतरणों का उपयोग करता है, इसलिए नहीं। इसके अलावा, containsIgnoreCase("ß", "ss")रिटर्न -1, जो हर लोकेल में गलत है (जर्मन "तेज s" "ss" को कैपिटलाइज़ करता है।
Maaartinus

फिर जर्मन शब्दों की तुलना करने का सही तरीका क्या होगा? ऐसा लगता है कि एक भाषा है जो तार की तुलना करने के हर तरीके को जटिल बनाती है: P
chomp

1
BTW: जर्मन भाषा को आधिकारिक तौर पर 2017 में एक राजधानी with के साथ विस्तारित किया गया था: de.wikipedia.org/wiki/Gro%C3%9Fes_%C3%9F । जर्मन कीबोर्ड पर, Shift + Alt Gr + test -> परीक्षण: 😁
Kaw

119

एक तेज़ कार्यान्वयन: उपयोग करना String.regionMatches()

रेगेक्सपी का उपयोग अपेक्षाकृत धीमा हो सकता है। अगर आप सिर्फ एक मामले में जांच करना चाहते हैं तो यह (धीमा होना) कोई मायने नहीं रखता। लेकिन अगर आपके पास एक सरणी या हजारों या सैकड़ों हजारों स्ट्रिंग्स का संग्रह है, तो चीजें बहुत धीमी हो सकती हैं।

नीचे प्रस्तुत समाधान न तो नियमित अभिव्यक्तियों का उपयोग करता है और न ही toLowerCase()(जो धीमा भी है क्योंकि यह एक और तार बनाता है और बस चेक के बाद उन्हें फेंक देता है)।

समाधान String.regionMatches () विधि पर बनाता है जो अज्ञात प्रतीत होता है। यह जांचता है कि 2 Stringक्षेत्र मेल खाते हैं, लेकिन यह महत्वपूर्ण है कि यह एक आसान ignoreCaseपैरामीटर के साथ एक अधिभार भी है ।

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

गति विश्लेषण

इस गति विश्लेषण का मतलब रॉकेट साइंस नहीं है, बस एक रफ तस्वीर है कि अलग-अलग तरीके कितने तेज हैं।

मैं 5 तरीकों की तुलना करता हूं।

  1. हमारी सम्‍मिलित आईऑनकोरस () विधि।
  2. लो-केस और कॉल दोनों स्ट्रिंग्स को कनवर्ट करके String.contains()
  3. स्रोत स्ट्रिंग को निचले-मामले में परिवर्तित करके और String.contains()प्री-कैशेड, लोअर-केसेड विकल्प के साथ कॉल करें । यह समाधान पहले से ही उतना लचीला नहीं है क्योंकि यह एक पूर्वनिर्धारित सबस्ट्रिंग का परीक्षण करता है।
  4. नियमित अभिव्यक्ति (स्वीकृत उत्तर Pattern.compile().matcher().find()...) का उपयोग करना
  5. नियमित अभिव्यक्ति का उपयोग करना लेकिन पूर्व-निर्मित और कैश्ड के साथ Pattern। यह समाधान पहले से ही उतना लचीला नहीं है क्योंकि यह एक पूर्वनिर्धारित सबस्ट्रिंग का परीक्षण करता है।

परिणाम (विधि को 10 मिलियन बार कॉल करके):

  1. हमारी विधि: 670 मि
  2. 2x toLowerCase () और सम्‍मिलित (): 2829 एमएस
  3. 1x tolowerCase () और शामिल () कैश्ड विकल्प के साथ: 2446 एमएस
  4. रेगेक्सप: 7180 एमएस
  5. कैश्ड के साथ रेगेक्सप Pattern: 1845 एमएस

तालिका में परिणाम:

                                            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

हमारा तरीका है 4x तेजी lowercasing और उपयोग की तुलना में contains(), तेजी से 10x नियमित अभिव्यक्ति है और यह भी उपयोग की तुलना में 3 गुना तेजी से भले ही Patternपूर्व-संचित है (और एक मनमाना स्ट्रिंग के लिए जाँच का लचीलापन खोने)।


विश्लेषण परीक्षण कोड

यदि आप रुचि रखते हैं कि विश्लेषण कैसे किया गया था, तो यहां पूरा चलने योग्य अनुप्रयोग है:

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 लेकिन ध्यान दें कि यह ß(जर्मन तेज एस; के लिए SS) विफल रहता है और कुछ अन्य पात्रों के लिए भी (स्रोत देखें String.regionMatches, जो दोनों रूपांतरणों की कोशिश करता है)।
मॉर्टिनस

2
आपका हमेशा एक ही तार का परीक्षण होता है, जो वास्तव में उचित तुलना नहीं है। 'मैं हूं' हमेशा बीच में होता है, जो अलग-अलग खोज विधियों के लिए एक अंतर हो सकता है या नहीं। बेहतर होगा कि रैंडम स्ट्रिंग्स जेनरेट की जाए और स्पीड पर भी रिपोर्ट की जाए जब कोई विकल्प मौजूद नहीं है।

2
यह वास्तव में Apache StringUtils
alain.janinm

1
@ alain.janinm मैं समानताएं देखने में विफल हूं। केवल एक चीज जो "करीब" लगती StringUtils.containsIgnoreCase()है वह यह है कि मेरा समाधान और अपाचे दोनों एक regionMatches()विधि (एक चक्र में) का उपयोग करते हैं, लेकिन यहां तक ​​कि मैं String.regionMatches()और अपाचे कॉल के समान नहीं है CharSequenceUtils.regionMatches()
आईसीजे

2
@icza वास्तव में CharSequenceUtils.regionMatchesकॉल करता है String.regionMatches। वैसे भी, मेरी बात यह जानकारी देने के लिए थी, कि अगर कोई पहले से ही StringUtils lib का उपयोग कर रहा है तो वह इसे सिर्फ इसलिए कह सकता है क्योंकि यह एक कारगर तरीका लगता है जैसे आप इसे बेंचमार्क साबित करते हैं। यदि मैं Apache lib का उपयोग नहीं कर रहा था, तो मैं निश्चित रूप से आपके तरीके का उपयोग करूंगा;)
alain.janinm

22

ऐसा करने का एक सरल तरीका (पैटर्न मिलान के बारे में चिंता किए बिना) दोनों Stringएस को लोअरकेस में बदलना होगा:

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

4
चरित्र का मामला भाषा पर निर्भर है, जिसका अर्थ है कि यह आपके कंप्यूटर पर काम करेगा लेकिन ग्राहक के लिए विफल रहेगा :)। देखें @ Adriaan Koster टिप्पणी।
kroiz

1
@kroiz, यह निर्भर करता है कि स्ट्रिंग कहाँ से आया है। "फ़ॉबर" और "फ़ू" की तुलना करना हमेशा मेल खाता होगा, हालाँकि यदि आप उपयोगकर्ता-इनपुट जानकारी, या भाषा-विशिष्ट सामग्री की तुलना कर रहे हैं, तो आप सही हैं - एक डेवलपर को सतर्क होना चाहिए।
फिल

16

हाँ, यह प्राप्त करने योग्य है:

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;

यह कोड स्ट्रिंग "TRUE!" लौटाएगा। जैसा कि पाया गया कि आपके पात्र निहित थे।


12
ToLowerCase () का उपयोग करने का एक बड़ा दोष यह है कि इसका परिणाम वर्तमान लोकेल पर निर्भर करता है। देखें: javapapers.com/core-java/…
एड्रियन कोस्टर

4
सवाल वास्तव में एक बेहतर समाधान होता है क्योंकि यह गैर-लोअरकेस के लिए विफल रहता है s2। इस तरह के विवरण के बारे में नहीं बोल रहा है कि यह संकलन नहीं करता है और यदि यह किया जाता है, तो यह एक स्ट्रिंग लौटाएगा।
मॉर्टिनस


3

यहां कुछ यूनिकोड-फ्रेंडली हैं जिन्हें आप ICU4j में खींच सकते हैं। मुझे लगता है कि "अनदेखा मामला" विधि नामों के लिए संदिग्ध है, हालांकि प्राथमिक शक्ति तुलना मामले की उपेक्षा करते हैं, इसे स्थानीयता-निर्भरता के रूप में वर्णित किया गया है। लेकिन यह उम्मीद है कि उपयोगकर्ता जिस तरह से उम्मीद करेंगे, वह स्थानीय रूप से निर्भर है।

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

मैंने एक स्ट्रिंग के केस-असंवेदनशील मैच को खोजने के लिए एक परीक्षण किया। मेरे पास एक क्षेत्र के रूप में एक स्ट्रिंग के साथ सभी 150,000 वस्तुओं का एक वेक्टर है, जो एक स्ट्रिंग से मेल खाने वाले सबसेट को खोजना चाहता था। मैंने तीन तरीके आज़माए:

  1. सभी को निचले मामले में बदलें

    for (SongInformation song: songs) {
        if (song.artist.toLowerCase().indexOf(pattern.toLowercase() > -1) {
                ...
        }
    }
  2. स्ट्रिंग मिलान () विधि का उपयोग करें

    for (SongInformation song: songs) {
        if (song.artist.matches("(?i).*" + pattern + ".*")) {
        ...
        }
    }
  3. नियमित अभिव्यक्ति का उपयोग करें

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

समय परिणाम हैं:

  • कोई प्रयास नहीं मैच: 20 मिसे

  • मैच कम करने के लिए: 182 मिसे

  • स्ट्रिंग मैच: 278 मिसे

  • नियमित अभिव्यक्ति: 65 मिसे

नियमित अभिव्यक्ति इस उपयोग के मामले में सबसे तेज़ लगती है।


अच्छा है कि आप समय के परिणाम डालते हैं। हर कोई कहता है कि रेगेक्स कितना धीमा है, लेकिन वास्तव में यह बहुत तेजी से होता है यदि आपको केवल एक बार रीजैक्स को संकलित करना है।
woot

1

रीजेक्स फ्लैग (केस असंवेदनशील {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

मुझे यकीन नहीं है कि आपका मुख्य प्रश्न यहाँ क्या है, लेकिन हाँ, .contains मामला संवेदनशील है।


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

मूल रूप से, यह एक विधि है जो दो तार लेती है। इसमें सम्‍मिलित नहीं (संवेदनशील) संस्करण होना चाहिए ()। शामिल विधि का उपयोग करते समय, आप यह देखना चाहते हैं कि क्या एक स्ट्रिंग दूसरे में निहित है।

यह विधि उस स्ट्रिंग को लेती है जो "सब" है और यह जांचता है कि क्या यह कंटेनर स्ट्रिंग के सबस्ट्रिंग के बराबर है जो "सब" की लंबाई के बराबर है। अगर तुम देखोfor लूप को देखते हैं, तो आप देखेंगे कि यह कंटेनर स्ट्रिंग के ऊपर सबस्ट्रिंग (यानी "उप" की लंबाई) में पुनरावृत्त करता है।

प्रत्येक पुनरावृत्ति यह देखने के लिए जांचता है कि क्या कंटेनर स्ट्रिंग का सबरिंग equalsIgnoreCaseउप करने के लिए है।


मूल रूप से यह एक विधि है जो दो तार लेती है। यह माना जाता है कि इसमें संवेदनशील केस शामिल नहीं है ()। शामिल विधि का उपयोग करते समय, आप यह देखना चाहते हैं कि क्या एक तार दूसरे में समाहित है। यह विधि उस स्ट्रिंग को लेती है जो "सब" है और यह जांचें कि क्या यह कंटेनर स्ट्रिंग के सब स्ट्रिंग के बराबर है, जो "उप" की लंबाई के बराबर है। यदि आप लूप के लिए देखते हैं, तो आप देखेंगे कि यह कंटेनर स्ट्रिंग पर उप स्ट्रिंग्स (जो "उप" की लंबाई है) में पुनरावृत्त करता है। प्रत्येक पुनरावृत्तियों यह देखने के लिए जांचता है कि क्या कंटेनर स्ट्रिंग का उप स्ट्रिंग उप के बराबर है।
सेठ

@ आपको अपने उत्तर में शायद इसे जोड़ना चाहिए।
गाय द हैट

2
यह अब तक की सबसे धीमी विधि है ... और यह जर्मन के लिए भी विफल है।
मॉर्टिनस

0

यदि आपको ASCII स्ट्रिंग को किसी अन्य ASCII स्ट्रिंग में खोजना है, जैसे कि URL , तो आपको बेहतर होने के लिए मेरा समाधान मिलेगा। मैंने गति के लिए icza की विधि और खान का परीक्षण किया है और यहां परिणाम हैं:

  • केस 1 ने 2788 एमएस - रीजनल मैचेस लिए
  • केस 2 ने 1520 एमएस - मेरा लिया

कोड:

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

    }

}

इस कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित अल्पकालिक सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि यह समस्या का एक अच्छा समाधान क्यों है, यह दिखाते हुए इसके दीर्घकालिक मूल्य में बहुत सुधार करेगा , और यह भविष्य के पाठकों को अन्य, समान प्रश्नों के साथ और अधिक उपयोगी बना देगा। कृपया कुछ स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें, जिसमें आपके द्वारा की गई धारणाएँ शामिल हैं।
टोबे स्पाइट

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

2
क्या आप यह बताकर अपना उत्तर सुधार सकते हैं कि आपका कोड समस्या का समाधान कैसे करता है?
इसुका

1
यह उत्तर पहले से ही कई अन्य लोगों द्वारा प्रदान किए गए इस प्रश्न के अधिक विस्तृत उत्तर में सुझाया गया है। मुझे नहीं लगता कि यह उत्तर यहां किसी उद्देश्य को पूरा करता है।
डेविडेवडेव

0

हम किसी भी मैक के साथ स्ट्रीम का उपयोग कर सकते हैं और इसमें जावा 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

या आप एक सरल दृष्टिकोण का उपयोग कर सकते हैं और स्ट्रिंग के मामले को प्रतिस्थापन के मामले में परिवर्तित कर सकते हैं और फिर विधि का उपयोग कर सकते हैं।



हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.