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();
}
}
यदि आप .NET रेगेक्स से परिचित हैं, तो आप सोच रहे होंगे कि क्या जावा की compile()
विधि .NET के RegexOptions.Compiled
संशोधक से संबंधित है ; जवाब न है। जावा का Pattern.compile()
तरीका .NET के रेगेक्स कंस्ट्रक्टर के समतुल्य है। जब आप Compiled
विकल्प निर्दिष्ट करें :
Regex r = new Regex(@"\d+", RegexOptions.Compiled);
... यह regex को CIL बाइट कोड से सीधे संकलित करता है, जिससे यह बहुत तेज़ी से प्रदर्शन कर सकता है, लेकिन अप-फ्रंट प्रोसेसिंग और मेमोरी उपयोग में एक महत्वपूर्ण लागत पर - इसे regexes के लिए स्टेरॉयड के रूप में सोचें। जावा का कोई समकक्ष नहीं है; उस पैटर्न के बीच कोई अंतर नहीं है जो String#matches(String)
आपके द्वारा बनाए गए दृश्यों के पीछे और आपके द्वारा स्पष्ट रूप से बनाया गया है Pattern#compile(String)
।
(संपादित करें: मैं मूल रूप से कहा गया है कि सभी .NET Regex वस्तुओं कैश नहीं किया जाता है, जो सही नहीं है .NET 2.0 के बाद से, स्वचालित संचयन होता है स्थिर तरीकों की तरह ही है। Regex.Matches()
, जब नहीं आप सीधे एक Regex निर्माता कहते हैं। रेफरी )