2009-05-19 17 views
47

मुझे एक ऐसी स्थिति मिली है जहां मैं उपयोगकर्ता से regexp प्राप्त करना चाहता हूं और इसे कुछ हज़ार इनपुट स्ट्रिंग के खिलाफ चला सकता हूं। मैनुअल में मैंने पाया कि RegExp ऑब्जेक्ट में .compile() विधि है जिसका उपयोग ऐसे मामलों में चीजों को गति देने के लिए किया जाता है। लेकिन अगर मैं पहले से ही निर्माता में पास कर चुका हूं तो मुझे regexp स्ट्रिंग को फिर से क्यों पारित करना होगा? शायद निर्माता compile() खुद ही करता है?जावास्क्रिप्ट: RegExp.compile() का क्या मतलब है?

उत्तर

83

RegExp().compile() method is deprecated। यह मूल रूप से कन्स्ट्रक्टर जैसा ही है, जो मुझे लगता है कि इसे बहिष्कृत क्यों किया गया था। आपको आजकल कन्स्ट्रक्टर का उपयोग करना होगा।

दूसरे शब्दों में, यदि आप ऐसा करने में सक्षम होने के लिए प्रयोग किया जाता:

var regexp = new RegExp("pattern"); 
regexp.compile("new pattern"); 

लेकिन आजकल यह केवल कॉल करने से किसी भी अलग नहीं है: जहाँ तक मैं सभी RegExp बता सकते हैं

var regexp = new RegExp("pattern"); 
regexp = new RegExp("new pattern"); 
3

.compile एक RegExp ऑब्जेक्ट की अंतर्निहित नियमित अभिव्यक्ति को प्रतिस्थापित करता है। मुझे लगता है कि संकलन में अतीत में मूल्य हो सकता है, लेकिन सभी आधुनिक जेएस इंजन पहले कॉल और कैश पर संकलित "संकलित" संस्करण "संकलित" संस्करण।

+1

कौन सा इंजन वास्तव में कर कैश नियमित अभिव्यक्ति? और क्या वे हमेशा ऐसा करते हैं? कैश में अभिव्यक्ति कितनी देर तक रखी जाती है? मैं विशेष रूप से वी 8 में रूचि रखता हूं। – CoDEmanX

6

और ओपेरा 11 के साथ, RegExp.compile() चल रहा है वास्तव में त्रुटियों का कारण बन जाएगा।

जाहिर है, जब ओपेरा "संकलित" एक regex, यह फ़ॉरवर्ड स्लैश में re.source स्ट्रिंग (जैसे re.source == "^(.)" हो जाता है "/^(.)/") गिर्द घूमती है। यदि आप मैन्युअल रूप से रेगेक्स संकलित करते हैं, तो ओपेरा इस तथ्य को नहीं पहचानता है और आगे बढ़ता है और इसे फिर से संकलित करता है (re.source"//^(.)//" बन जाता है)। प्रत्येक संकलन परिणाम आगे के स्लेश के एक अतिरिक्त सेट में होता है, जो नियमित अभिव्यक्ति के अर्थ को बदलता है और त्रुटियों में परिणाम देता है।

2

आपको पहले अपने regex संकलन यदि आप / उपयोग कर रहे हैं इसका इस्तेमाल करने के लिए है, इस आजमा कर देखें:

var regex=new RegExp('/[a-zA-Z]/') 
 

 
console.log("not compiled with escape /", regex.test("ciao")) 
 

 
regex.compile() 
 

 
console.log("compiled", regex.test("ciao")) 
 

 
var regex=new RegExp('[a-zA-Z]') 
 

 
console.log("not compiled, but no escape /", regex.test("ciao"))

+2

वाह, यह दिलचस्प है। मैंने अभी इसे चेक किया है, और आप सही हैं! हालांकि एमडीएन में इसका उल्लेख नहीं है। –

+2

इस स्पष्टीकरण को देखें: http://stackoverflow.com/a/7964948/651789 – ken

संबंधित मुद्दे