জাভা রেজেজেসে ম্যাচগুলি () এবং সন্ধান () এর মধ্যে পার্থক্য


249

আমি matches()এবং এর মধ্যে পার্থক্য বুঝতে চেষ্টা করছি find()

জাভাডোকের মতে, (আমি যা বুঝতে পেরেছি), matches()পুরো স্ট্রিংটি অনুসন্ধান করবে এমনকি এটি এটি যা সন্ধান করছে find()তা খুঁজে পেয়েছে এবং যখন এটি সন্ধান করছে তা খুঁজে পাবে।

যদি এই অনুমানটি সঠিক হয় তবে আপনি যখনই এর matches()পরিবর্তে আপনি কখন ব্যবহার করতে চান তা দেখতে পাচ্ছি না find(), যদি না আপনি এটি খুঁজে পাওয়া মিলগুলির সংখ্যা গণনা করতে চান।

আমার মতে স্ট্রিং ক্লাসটি তখন ইনবিল্ট পদ্ধতি হিসাবে find()পরিবর্তিত হওয়া উচিত matches()

সুতরাং সংক্ষেপে:

  1. আমার ধারণা সঠিক?
  2. matches()পরিবর্তে এটি ব্যবহার করা কখন কার্যকর find()?

2
সচেতন থাকুন যে find()একাধিকবার কল করা তার জন্য বিভিন্ন ফলাফল দিতে পারে Matcher। আমার উত্তর নীচে দেখুন।
এল। হল্যান্ডা

উত্তর:


300

matchesপুরো স্ট্রিংয়ের বিপরীতে অভিব্যক্তিটি মেলে ধরার চেষ্টা করে এবং স্পষ্টভাবে ^শুরুতে এবং $আপনার প্যাটার্নের শেষে একটি যুক্ত করে, অর্থ এটি কোনও স্ট্রিংয়ের সন্ধান করবে না। সুতরাং এই কোডের আউটপুট:

public static void main(String[] args) throws ParseException {
    Pattern p = Pattern.compile("\\d\\d\\d");
    Matcher m = p.matcher("a123b");
    System.out.println(m.find());
    System.out.println(m.matches());

    p = Pattern.compile("^\\d\\d\\d$");
    m = p.matcher("123");
    System.out.println(m.find());
    System.out.println(m.matches());
}

/* output:
true
false
true
true
*/

123পদ্ধতিটি আউটপুট দেয় a123bতাই এর একটি স্ট্রিং থাকে find()matches()কেবল 'দেখায়' a123bযা একই নয় 123এবং এভাবে মিথ্যা ফলাফল করে।


25
এই উত্তরটি বিভ্রান্তিকর। lied এবং $ এর আশেপাশে বোঝানো matchers()কেবল একটি নয় find()$ সচেতন থাকুন যে .find()একাধিকবার কল করার আগে যদি না হয় তবে বিভিন্ন ফলাফল হতে পারে reset(), যখন matches()সর্বদা একই ফল ফিরে আসবে। আমার উত্তর নীচে দেখুন।
এল। হল্যান্ডা

80

matchesপুরো স্ট্রিং প্রদত্ত প্যাটার্নের সাথে মিলে গেলে সত্যটি ফিরে আসুন। findপ্যাটার্নের সাথে মেলে এমন একটি স্ট্রিংয়ের সন্ধান করার চেষ্টা করে।


35
আপনি বলতে পারেন যে matches(p)এটি একই find("^" + p + "$")যে কোনও পরিষ্কার।
jensgram

4
উত্তরটি পরিষ্কার করার জন্য কেবল একটি উদাহরণ: "[এজে] +" স্ট্রিং সহ "123abc123" ম্যাচগুলি ব্যবহার করে ব্যর্থ হবে () তবে সন্ধান () ব্যবহার করে সফল হবে।
বেজম্যাক্স

3
@ ম্যাক্স অবিকল, "123abc123".matches("[a-z]+")ঠিক যেমন ব্যর্থ "123abc123".find("^[a-z]+$")হবে। আমার বক্তব্যটি ছিল, এটি matches()সম্পূর্ণ ম্যাচের জন্য যায় ঠিক যেমন find()শুরু এবং শেষ উভয়ই অ্যাঙ্করগুলির সাথে।
jensgram

5
Pattern.compile("some pattern").matcher(str).matches()সমানPattern.compile("^some pattern$").matcher(str).find()
অ্যালেক্সার

3
@AlexR / @jensgram: ...("some pattern").matcher(str).matches()হয় না ঠিক করার সমান ...("^some pattern$").matcher(str).find()যে একমাত্র প্রথম কল সত্য। আমার উত্তর নীচে দেখুন।
এল। হল্যান্ডা

62

matches()সম্পূর্ণ স্ট্রিংটি মিলে গেলেই সত্যটি ফিরে আসবে। রেজেক্সের সাথে মিলে এমন স্ট্রিংয়ের মধ্যে পরবর্তী ঘটনাটি find()অনুসন্ধান করার চেষ্টা করবে । "পরবর্তী" উপর জোর নোট করুন। তার মানে, find()একাধিকবার কল করার ফলাফল একই রকম নাও হতে পারে। তদ্ব্যতীত, ব্যবহার করে find()আপনি start()অবস্থানটি ফেরতের জন্য কল করতে পারেন সাবস্ট্রিংয়ের সাথে মিল ছিল।

final Matcher subMatcher = Pattern.compile("\\d+").matcher("skrf35kesruytfkwu4ty7sdfs");
System.out.println("Found: " + subMatcher.matches());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find());
System.out.println("Found: " + subMatcher.find());
System.out.println("Matched: " + subMatcher.matches());

System.out.println("-----------");
final Matcher fullMatcher = Pattern.compile("^\\w+$").matcher("skrf35kesruytfkwu4ty7sdfs");
System.out.println("Found: " + fullMatcher.find() + " - position " + fullMatcher.start());
System.out.println("Found: " + fullMatcher.find());
System.out.println("Found: " + fullMatcher.find());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());

আউটপুট দেবে:

পাওয়া: মিথ্যা
পাওয়া: সত্য - অবস্থান 4
পাওয়া গেছে: সত্য - অবস্থান 17
পাওয়া গেছে: সত্য - অবস্থান 20
পাওয়া: মিথ্যা
পাওয়া: মিথ্যা
মিলছে: মিথ্যা
-----------
পাওয়া গেছে: সত্য - অবস্থান 0
পাওয়া: মিথ্যা
পাওয়া: মিথ্যা
মিলছে: সত্য
মিলছে: সত্য
মিলছে: সত্য
মিলছে: সত্য

সুতরাং, রেজেক্সটি চারপাশে থাকলেও এবং পুরো স্ট্রিংয়ের সাথে মিল রেখেও find()যদি একাধিক বার কল করার সময় সাবধান হন theMatcher^$


2
খুব সহায়ক সাথী
ডকইয়ার্ড

6

find()নিয়মিত প্রকাশের বিরুদ্ধে সাব-স্ট্রিং matches()বিবেচনা করবে যেখানে সম্পূর্ণ অভিব্যক্তি বিবেচনা করা হবে।

find() এক্সপ্রেশনটির সাব-স্ট্রিংটি প্যাটার্নের সাথে মেলে তবেই সত্যটি প্রত্যাশা করবে।

public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d");
        String candidate = "Java123";
        Matcher m = p.matcher(candidate);

        if (m != null){
            System.out.println(m.find());//true
            System.out.println(m.matches());//false
        }
    }

3

matches();বাফার করে না, তবে find()বাফার করে।find()প্রথমে স্ট্রিংয়ের শেষে অনুসন্ধান করে ফলাফলটি সূচী করে এবং বুলিয়ান মান এবং সংশ্লিষ্ট সূচি ফেরত দেয়।

এজন্য আপনার যখন একটি কোড থাকে

1:Pattern.compile("[a-z]");

2:Pattern.matcher("0a1b1c3d4");

3:int count = 0;

4:while(matcher.find()){

5:count++: }

4: প্যাটার্ন গঠন ব্যবহার দ্বারা নির্দিষ্ট আপনার কোড (সূচক সূচক পুরো মাধ্যমে পড়তে হবে Regex ইঞ্জিন regex[single character]। অন্তত একটি মিল খুঁজে যদি এ ধরনের মিল খুঁজে পাওয়া যায়, তারপর সূচীবদ্ধ করা হবে লুপ উপর ভিত্তি করে চালানো হবে সূচকের ফলাফল অন্যথায় যদি এটি আগের মতো গণনা matches()না করে; না করে, যদিও স্টেটমেন্টটি কখনই কার্যকর করতে পারে না কারণ ম্যাচযুক্ত স্ট্রিংয়ের প্রথম অক্ষর বর্ণমালা নয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.