compile()পদ্ধতি সবসময় কিছু সময়ে বলা হয়; এটি প্যাটার্ন অবজেক্ট তৈরির একমাত্র উপায়। সুতরাং প্রশ্নটি আসলে, আপনি কেন এটি স্পষ্টভাবে কল করবেন ? একটি কারণ হ'ল ম্যাচারের অবজেক্টের জন্য আপনার একটি রেফারেন্স প্রয়োজন যাতে আপনি এর পদ্ধতিগুলি ব্যবহার করতে পারেন, যেমন group(int)ক্যাপচারিং গ্রুপগুলির সামগ্রীগুলি পুনরুদ্ধার করতে। ম্যাচারের অবজেক্টের হোল্ড পাওয়ার একমাত্র উপায় হ'ল প্যাটার্ন অবজেক্টের matcher()পদ্ধতির মাধ্যমে এবং প্যাটার্ন অবজেক্টের আওল্ড পাওয়ার একমাত্র উপায় compile()পদ্ধতিটির মাধ্যমে । তারপরে একটি find()পদ্ধতি রয়েছে যা matches()স্ট্রিং বা প্যাটার্ন ক্লাসে নকল হয় না।
অন্য কারণ হ'ল বারবার একই প্যাটার্ন অবজেক্ট তৈরি করা এড়ানো। আপনি যখনই স্ট্রিংয়ের (অথবা matches()প্যাটার্নে স্থির পদ্ধতি) রেগেক্স-চালিত পদ্ধতিগুলির একটি ব্যবহার করেন , এটি একটি নতুন প্যাটার্ন এবং একটি নতুন ম্যাচার তৈরি করে। সুতরাং এই কোড স্নিপেট:
for (String s : myStringList) {
if ( s.matches("\\d+") ) {
doSomething();
}
}
... এর ঠিক সমান:
for (String s : myStringList) {
if ( Pattern.compile("\\d+").matcher(s).matches() ) {
doSomething();
}
}
স্পষ্টতই, এটি অনেক অপ্রয়োজনীয় কাজ করে চলেছে। প্রকৃতপক্ষে, রিজেক্স সংকলন করতে এবং প্যাটার্ন অবজেক্টটি ইনস্ট্যান্ট করতে সহজেই এটি বেশি সময় নিতে পারে, এটি কোনও আসল ম্যাচ সম্পাদনের চেয়ে বেশি করে তোলে। সুতরাং এটি লুপ থেকে যে পদক্ষেপ টান সাধারণত বোধগম্য। আপনি সময়ের সাথে সাথে ম্যাচারও তৈরি করতে পারেন, যদিও এগুলি প্রায় এত ব্যয়বহুল নয়:
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("");
for (String s : myStringList) {
if ( m.reset(s).matches() ) {
doSomething();
}
}
আপনি যদি নেট নেটজেজসের সাথে পরিচিত হন, আপনি ভাবতে পারেন যে জাভা compile()পদ্ধতিটি নেট নেটফায়ারটির সাথে সম্পর্কিত কিনা RegexOptions.Compiled; উত্তর না হয়। জাভার Pattern.compile()পদ্ধতিটি কেবল নেট নেট এর রেজেক্স কন্সট্রাক্টরের সমতুল্য। আপনি যখন Compiledবিকল্পটি নির্দিষ্ট করেন :
Regex r = new Regex(@"\d+", RegexOptions.Compiled);
... এটি রেগেক্সকে সরাসরি সিআইএল বাইট কোডে সংকলন করে, এটি আরও দ্রুত সঞ্চালনের অনুমতি দেয়, তবে আপ-ফ্রন্ট প্রসেসিং এবং মেমরির ব্যবহারের জন্য একটি উল্লেখযোগ্য ব্যয়ে - এটিকে রেজিক্সগুলির স্টেরয়েড হিসাবে ভাবেন। জাভার কোন সমতুল্য নেই; পর্দার পিছনে যে প্যাটার্নটি তৈরি করা হয়েছে String#matches(String)এবং আপনি স্পষ্টভাবে তৈরি করেছেন তার মধ্যে কোনও পার্থক্য নেই Pattern#compile(String)।
(সম্পাদনা: আমি প্রাথমিকভাবে বলেছি যে সমস্ত .NET রেইজেক্স অবজেক্ট ক্যাশেড, যা ভুল।। নেট 2.0, যেহেতু স্বয়ংক্রিয় ক্যাচিং কেবল স্থির পদ্ধতিগুলির সাথে ঘটে Regex.Matches()যখন আপনি সরাসরি রেজেক্স কনস্ট্রাক্টরকে কল করেন না ref রেফ )