compile()
विधि को हमेशा किसी बिंदु पर बुलाया जाता है; पैटर्न ऑब्जेक्ट बनाने का यही एकमात्र तरीका है। तो सवाल वास्तव में है, आप इसे स्पष्ट रूप से क्यों कहते हैं? एक कारण यह है कि आपको Matcher ऑब्जेक्ट के संदर्भ की आवश्यकता है ताकि आप कैप्चरिंग समूहों की सामग्री को पुनर्प्राप्त करने के लिए group(int)
जैसे विधियों का उपयोग कर सकें। Matcher ऑब्जेक्ट को पकड़ने का एकमात्र तरीका पैटर्न ऑब्जेक्ट की matcher()
विधि के माध्यम से है, और पैटर्न ऑब्जेक्ट को पकड़ने का एकमात्र तरीका compile()
विधि के माध्यम से है। फिर find()
विधि है, जो matches()
के विपरीत, स्ट्रिंग या पैटर्न कक्षाओं में डुप्लीकेट नहीं है।
दूसरा कारण एक ही पैटर्न ऑब्जेक्ट को बार-बार बनाने से बचने के लिए है। हर बार जब आप स्ट्रिंग में रेगेक्स-संचालित विधियों में से एक का उपयोग करते हैं (या पैटर्न में स्थिर matches()
विधि), यह एक नया पैटर्न और एक नया Matcher बनाता है। तो इस कोड स्निपेट: जाहिर है
for (String s : myStringList) {
if (Pattern.compile("\\d+").matcher(s).matches()) {
doSomething();
}
}
, कि अनावश्यक बहुत काम कर रहा है:
for (String s : myStringList) {
if (s.matches("\\d+")) {
doSomething();
}
}
... वास्तव में इस के बराबर है। वास्तव में, यह वास्तविक मिलान करने के लिए, रेगेक्स को संकलित करने और पैटर्न ऑब्जेक्ट को तुरंत चालू करने में अधिक समय ले सकता है। तो आमतौर पर लूप के उस चरण को खींचने के लिए यह समझ में आता है। आप, साथ ही समय से आगे Matcher बना सकते हैं, हालांकि वे लगभग इतना महंगा नहीं कर रहे हैं:
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("");
for (String s : myStringList) {
if (m.reset(s).matches()) {
doSomething();
}
}
यदि आप नेट regexes से परिचित हैं, आप सोच हो सकती है यदि जावा के compile()
विधि नेट के से संबंधित है RegexOptions.Compiled
संशोधक; जवाब न है। जावा की Pattern.compile()
विधि केवल .NET के रेगेक्स कन्स्ट्रक्टर के बराबर है। जब आप Compiled
विकल्प निर्दिष्ट करते हैं:
Regex r = new Regex(@"\d+", RegexOptions.Compiled);
...यह रेगेक्स को सीआईएल बाइट कोड पर सीधे संकलित करता है, जिससे इसे बहुत तेजी से करने की इजाजत मिलती है, लेकिन ऊपर की ओर प्रसंस्करण और स्मृति उपयोग में एक महत्वपूर्ण लागत पर - इसे रेगेक्स के लिए स्टेरॉयड के रूप में सोचें। जावा के बराबर नहीं है; String#matches(String)
द्वारा दृश्यों के पीछे बनाए गए पैटर्न के बीच कोई अंतर नहीं है और एक जिसे आप Pattern#compile(String)
के साथ स्पष्ट रूप से बनाते हैं।
(संपादित करें:।। मैं मूल रूप से कहा गया है कि सभी .NET Regex वस्तुओं कैश नहीं किया जाता है, जो सही नहीं है .NET 2.0 के बाद से, स्वत: कैशिंग केवल Regex.Matches()
की तरह स्थिर तरीकों के साथ होता है, जब न तो आप सीधे एक Regex निर्माता फोन ref)
खैर, कार्यान्वयन (जेडीके 1.7 में) जैसे महत्व लगभग कोई नहीं है, केवल नए पैटर्न (रेगेक्स, 0) के लिए शॉर्टकट है; उस ने कहा, असली महत्व स्थिर विधि नहीं है, लेकिन एक नए पैटर्न की सृजन और वापसी जिसे बाद के उपयोग के लिए बचाया जा सकता है। हो सकता है कि अन्य कार्यान्वयन हो जहां स्थैतिक विधि एक नया मार्ग लेती है और पैटर्न वस्तुओं को कैश करती है, और यह Pattern.compile() महत्व का वास्तविक मामला होगा! – marcolopes
उत्तर पैटर्न और मिलान करने वाले वर्गों को अलग करने के महत्व को हाइलाइट करते हैं (जो शायद प्रश्न पूछता है), लेकिन कोई भी जवाब नहीं देता है कि हम एक स्थिर संकलन समारोह के बजाय केवल कन्स्ट्रक्टर 'नया पैटर्न (रेगेक्स)' क्यों नहीं उपयोग कर सकते हैं। मार्कोप्स टिप्पणी स्पॉट पर है। –