জাভাতে কোনও স্ট্রিংয়ের ক্ষেত্রে সংবেদনশীল পদ্ধতিতে অন্য স্ট্রিং রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?


386

বলুন আমার দুটি স্ট্রিং রয়েছে,

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

আমি s2অন্তর্ভুক্ত থাকা একটি চেক রিটার্ন সম্পাদন করতে চাই s1। আমি এটি দিয়ে এটি করতে পারি:

return s1.contains(s2);

আমি যথেষ্ট নিশ্চিত যে contains()এটি কেস সংবেদনশীল, তবে ডকুমেন্টেশন পড়া থেকে আমি এটি নিশ্চিত করে নির্ধারণ করতে পারি না। যদি এটি হয় তবে আমি মনে করি আমার সেরা পদ্ধতিটি এমন কিছু হবে:

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

এগুলি বাদ দিয়ে, কেস-সংবেদনশীলতার বিষয়ে চিন্তা না করেই এটি সম্পাদনের আর কোনও (সম্ভবত আরও ভাল) উপায় আছে?


ডকুমাভাটি ডকুমেন্টেশন ব্যর্থ হলে এটি পরীক্ষা করার এক অত্যন্ত সহজ উপায় হবে। এর ইন্টারঅ্যাকশন উইন্ডোতে কয়েকটি পরীক্ষার কেস টাইপ করুন এবং আপনার এটি বের করা উচিত।
ইফফোরএফোর্ট

17
আমি মনে করি আপনি নিজের প্রশ্নের উত্তর দিয়েছেন। আমি মনে করি না নীচের কোনও সমাধান এর চেয়ে ভাল। তবে এগুলি অবশ্যই ধীর।
নিকোলে দিমিত্রভ

7
আপনার সমাধানটি উত্তরের যেকোন একটি থেকে সহজতর নয়
লবস্টারম্যান

2
আমি এবং এখানে অনেকের উত্তর, আপনার প্রশ্নের মধ্যে রয়েছে।
ললিত ফৌজদার

1
আপনার উদাহরণটি হ'ল সহজ, সর্বাধিক পঠনযোগ্য এবং সম্ভবত এটি করার সর্বোত্তম উপায় - আমি যে উত্তরগুলি দেখছি তার চেয়ে ভাল।
ব্যবহারকারী 1258361

উত্তর:


320

হ্যাঁ, সমন্বয়গুলি সংবেদনশীল। সংবেদনশীল মিলের জন্য আপনি CASE_INSENSITIVE পতাকা সহ java.util.regex.Pattern ব্যবহার করতে পারেন:

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

সম্পাদনা: যদি এস 2-এ রেগেক্স বিশেষ অক্ষর থাকে (যার মধ্যে অনেকগুলি থাকে) প্রথমে এটি উদ্ধৃত করা গুরুত্বপূর্ণ। আমি আমার উত্তর সংশোধন করেছি যেহেতু এটিই প্রথম জন লোক দেখবে, তবে ম্যাট কোয়েলকে ভোট দিন তিনি যেহেতু এটি উল্লেখ করেছেন pointed


23
ডকুমেন্টেশনের জন্য যেমন বলা হয়েছে Pattern.CASE_INSENSITIVE, এটি কেবল ASCII অক্ষরের জন্য কাজ করে (যেমন, "Ä" "ä" এর সাথে মেলে না)। এটি UNICODE_CASEঅর্জনের জন্য একটি অতিরিক্তভাবে পতাকা নির্দিষ্ট করা প্রয়োজন ।
ফিলিপ উইন্ডার

72
এই পদ্ধতির Patternচেয়ে বেশি পারফরম্যান্ট ব্যবহার করা হয় s1.toLowerCase().contains(s2.toLowerCase())?
রজত গুপ্ত

6
@ ব্যবহারকারী01 আমি একটি গতি বিশ্লেষণ করেছি। : (আমি একটি দ্রুত সমাধান দেখিয়েছেন) ফলাফলের জন্য আমার উত্তর দেখুন stackoverflow.com/a/25379180/1705598
icza

10
এটি আরও স্পষ্ট করে বলব যদি আমাদের আরও ভাল চলক নাম থাকত:Pattern.compile(Pattern.quote(needle), Pattern.CASE_INSENSITIVE).matcher(haystack).find()
জন বোয়ার্স

5
@ ব্যবহারকারী01 যথার্থতার আগে কার্য সম্পাদনের আগে আসে, এবং টুলওয়ারকেস ব্যবহার করে সম্ভাব্যভাবে ভুল ফলাফল দেবে (উদাহরণস্বরূপ, সিগমা অক্ষরটি সম্বলিত কিছু গ্রীক পাঠ্যের সাথে তুলনা করার সময়, যার একই ছোট বড় আকারের জন্য দুটি ছোট আকার রয়েছে)।
ক্লিটোস কিরিয়াকু 20'15

266

ডেভ এল দ্বারা উত্তরের একটি সমস্যা হ'ল এস 2-তে রিজেেক্স মার্কআপ যেমন \dইত্যাদি থাকে is

আপনি এস 2 তে প্যাটার্ন.কোয়েট () কল করতে চান:

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

1
ম্যাট ভালো লাগছে। কোন পদ্ধতিটি আরও দক্ষ তা জানতে আগ্রহী - ছোট হাতের অক্ষর বা আপনার প্যাটার্ন সমাধান contains একক তুলনা করার জন্য কোনও প্যাটার্ন ব্যবহার করা কি কম দক্ষ নয়, তবে একাধিক তুলনার জন্য আরও দক্ষ?
হারুন

41
.ToLowerCase ()। () পদ্ধতিতে রয়েছে (বেশিরভাগ ক্ষেত্রে সম্ভবত পদ্ধতিটি দ্রুততর হবে)। আমিও সম্ভবত কম জটিলতার জন্য সেই স্টাইলটি পছন্দ করব।
ম্যাট কোয়েল

3
অ্যারোন ফার্গুসন @ হ্যাঁ, আসলেই toLowerCase().contains()দ্রুত is আমি কিছু গতি বিশ্লেষণ সঞ্চালিত, ফলাফলের জন্য আমার উত্তর দেখুন: stackoverflow.com/a/25379180/1705598
icza

2
@ ম্যাটকইয়েল এর ভুল হওয়ার কোনও মানে নেই যদি এটি ভুল হয়ে যায়। উদাহরণস্বরূপ, গ্রীক রাজধানী সিগমাতে দুটি ছোট হাতের রূপ রয়েছে (এটি কোনও শব্দের শেষে আসে কিনা তার উপর নির্ভর করে) এবং কেস-সংবেদনশীল সাবস্ট্রিং ম্যাচ করার চেষ্টা করার সময়, যেখানে স্ট্রিংটি সিগমার সাথে শেষ হয়, আপনি সহজেই ভুল হতে পারেন ফলাফল নেই।
ক্লিটোস কিরিয়াকু 20'15

আমি মনে করি Pattern.UNICODE_CASEআমাদেরও পতাকা যুক্ত করা উচিত । আপনি কি এটি নিশ্চিত করতে পারেন?
থারিক নগ্রোহোতোমো

160

তুমি ব্যবহার করতে পার

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

এ্যাপাচি কমন্স গ্রন্থাগার জিনিস এই সাজানোর জন্য খুবই দরকারী। এবং এই নির্দিষ্টটি নিয়মিত এক্সপ্রেশনগুলির চেয়ে ভাল হতে পারে কারণ কার্য সম্পাদনের দিক থেকে রেজেেক্স সর্বদা ব্যয়বহুল।


1
কেউ কি জানেন যে এটি লোকালকে সম্মান করে?
চার্লস উড

12
@ চার্লসউড এটি প্রতিনিধি দেয় String.regionMatches, যা চরিত্র অনুসারে রূপান্তর ব্যবহার করে, তাই না। অধিকন্তু, containsIgnoreCase("ß", "ss")আয় -1, যা (প্রতি লোকেলে ভুল জার্মান "ধারালো s" এর বড় হাতের অক্ষরে "এস এস" হয়।
maaartinus

জার্মান শব্দের তুলনা করার সঠিক উপায়টি কোনটি? মনে হচ্ছে এটি এমন একটি ভাষা যা স্ট্রিংগুলির তুলনা করার প্রতিটি
chomp

1
বিটিডাব্লু: জার্মান ভাষায় সরকারীভাবে মূলধন বাড়ানো হয়েছিল 2017 ২০১ß সালে: ডি.উইকিপিডিয়া.রোগ / উইকি / গ্রোটিসি ৩৯৯9 ফি_৯ সিটি ৯৯৯ ফ । জার্মান কীবোর্ডগুলিতে, শিফট + আল্ট জিআর + ß -> পরীক্ষা টাইপ করুন: ẞ 😁
কাওু

119

একটি দ্রুত বাস্তবায়ন: ব্যবহার String.regionMatches()

রিজেক্সপ ব্যবহার করা তুলনামূলকভাবে ধীর হতে পারে। আপনি যদি কেবল একটি ক্ষেত্রে যাচাই করতে চান তবে এটি (ধীর হয়ে চলছে) কিছু যায় আসে না। তবে আপনার যদি অ্যারে বা কয়েক হাজার বা কয়েক হাজার স্ট্রিংয়ের সংকলন থাকে তবে জিনিসগুলি বেশ ধীর হয়ে যেতে পারে।

নীচের উপস্থাপিত সমাধানটি নিয়মিত অভিব্যক্তি ব্যবহার করে না toLowerCase()(যা এটি ধীর কারণ এটি অন্য স্ট্রিং তৈরি করে এবং কেবল চেকের পরে এগুলি ফেলে দেয়)।

সমাধানটি স্ট্রিং.গ্রিওনম্যাচগুলি () পদ্ধতিতে তৈরি করে যা অজানা বলে মনে হয়। এটি 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 টু লোওয়ারকেস () এবং এতে রয়েছে (): 2829 এমএস
  3. 1x টুলওয়ারকেস () এবং এতে () ক্যাশেড স্ট্রস্ট্রিং সহ রয়েছে: 2446 এমএস
  4. Regexp: 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 রেগুলার এক্সপ্রেশনের এবং ব্যবহার তুলনায় 3x দ্রুত এমনকি যদি 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
এটি অ্যাপাচি স্ট্রিং ইউটিলস পদ্ধতির খুব কাছেই রয়েছে বলে মনে হচ্ছে: গ্রেপকোড
রিপো

1
@ alain.janinm আমি মিলগুলি দেখতে ব্যর্থ to কেবল যেটির সাথে "কাছাকাছি" মনে StringUtils.containsIgnoreCase()হচ্ছে তা হ'ল আমার সমাধান এবং অ্যাপাচি উভয়ই একটি regionMatches()পদ্ধতি ব্যবহার করে (একটি চক্রের মধ্যে), তবে এটি আমি কল করি না String.regionMatches()এবং আপাচি কল করার মতো নয় CharSequenceUtils.regionMatches()
আইজজা

2
@ আইকজা CharSequenceUtils.regionMatchesআসলেই কল করে String.regionMatches। যাইহোক, আমার বক্তব্যটি তথ্যটি দেওয়ার ছিল, যে কেউ যদি ইতিমধ্যে স্ট্রিংটিলস লাইব ব্যবহার করে থাকে তবে তিনি কেবল এটি কল করতে পারেন কারণ এটি আপনার পক্ষে প্রমাণ করার মতো একটি কার্যকর উপায় বলে মনে হচ্ছে বেঞ্চমার্ক। আমি যদি আপাচি
লাইব

22

এটি করার একটি সহজ উপায় (প্যাটার্ন মিলের বিষয়ে চিন্তা না করে) উভয়কে Stringছোট হাতের মধ্যে রূপান্তরিত করবে :

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

4
চরিত্রের ক্ষেত্রে ভাষা নির্ভর, যার অর্থ এটি আপনার কম্পিউটারে কাজ করবে তবে গ্রাহকের জন্য ব্যর্থ হবে :)। @ অ্যাড্রিয়ান কোস্টার মন্তব্য দেখুন।
ক্রাইজ

1
@ ক্রোজ, এটি স্ট্রিং কোথা থেকে এসেছে তা নির্ভর করে। "ফুবার" এবং "এফইউও" তুলনা সবসময় মিলবে তবে আপনি যদি ব্যবহারকারী-ইনপুট তথ্য বা ভাষা-নির্দিষ্ট সামগ্রীর তুলনা করছেন তবে আপনি ঠিক বলেছেন - একজন বিকাশকারীকে সতর্ক হওয়া উচিত।
ফিল

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;

এই কোডটি স্ট্রিংকে "সত্য!" যেমন এটি পাওয়া গেছে যে আপনার অক্ষরগুলি অন্তর্ভুক্ত ছিল।


12
টুলওয়ারকেস () ব্যবহারের একটি বড় অসুবিধা হ'ল ফলাফলটি বর্তমান লোকেলের উপর নির্ভর করে। দেখুন: javapapers.com/core-java/…
অ্যাড্রিয়ান কোস্টার

4
প্রশ্নটি আসলে একটি আরও ভাল সমাধান ধারণ করে যেহেতু এটি একটি নিম্ন-অক্ষরের জন্য ব্যর্থ s2। এই যেমন সংকলন করে না এবং যেমন যদি এটি বিবরণ সম্পর্কে কথা না, এটি একটি স্ট্রিং ফিরে চাই।
মার্টিনাস


3

আপনি কিছু ইউনিকোড-বান্ধব এখানে আপনি যদি আইসিইউ 4 জনে টানেন তবে আপনি তৈরি করতে পারেন। আমার ধারণা "পদ্ধতি উপেক্ষা করা" পদ্ধতিটির নামগুলির জন্য সন্দেহজনক কারণ যদিও প্রাথমিক শক্তি তুলনা কেস উপেক্ষা করে না, এটি স্থানীয়ভাবে নির্ভরশীল হিসাবে বর্ণিত হিসাবে বর্ণনা করা হয়। তবে এটি আশা করা যায় যে কোনওভাবে ব্যবহারকারী প্রত্যাশা করবে স্থানীয়ভাবে নির্ভর।

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

রেগেক্স পতাকা ব্যবহার করে একটি সহজ সংক্ষিপ্ত উপায় রয়েছে (কেস সংবেদনশীল ise 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

আমি নিশ্চিত না যে এখানে আপনার মূল প্রশ্নটি কী, তবে হ্যাঁ, বিষয়বস্তু সংবেদনশীল।


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 স্ট্রিং অনুসন্ধান করতে হয় তবে আপনি আমার সমাধানটি আরও ভাল হিসাবে আবিষ্কার করতে পারেন। আমি গতির জন্য আইজজার পদ্ধতি এবং আমার পরীক্ষা করেছি এবং ফলাফলগুলি এখানে:

  • কেস 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

অথবা আপনি একটি সহজ পদ্ধতির ব্যবহার করতে পারেন এবং কেবল স্ট্রিংয়ের কেসটিকে স্ট্রিংয়ের ক্ষেত্রে রূপান্তর করতে পারেন এবং তারপরে ব্যবহারের পদ্ধতি রয়েছে।



-1

আপনি এই জাতীয় কিছু করতে পারেন:

String s1 = "AbBaCca";
String s2 = "bac";
String toLower = s1.toLowerCase();
return toLower.contains(s2);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.