2011-08-10 18 views
14

मैं इस छोटे जावा स्क्रिप्ट कोड के साथ कुछ परेशानियों:जावास्क्रिप्ट और नियमित अभिव्यक्ति: शाब्दिक वाक्यविन्यास बनाम। RegExp ऑब्जेक्ट

var text="Z Test Yeah ! Z"; 

// With literal syntax, it returns true: good! 
alert(/(Z[\s\S]*?Z)/g.test(text)); 

// But not with the RegExp object O_o 
var reg=new RegExp('Z[\s\S]*?Z','g'); 
alert(reg.test(text)); 

मुझे समझ नहीं आता क्यों शाब्दिक वाक्य रचना और RegExp ऑब्जेक्ट मुझे एक ही परिणाम देना नहीं है ... समस्या यह है कि है मुझे RegExp ऑब्जेक्ट का उपयोग करना होगा क्योंकि मेरे पास बाद में कुछ चर होंगे।

कोई विचार?

अग्रिम में :)

+2

एक अच्छी तरह से स्वरूपित, अच्छी तरह से लिखित पहला प्रश्न लिखने पर अच्छी नौकरी। – zzzzBov

उत्तर

18

धन्यवाद आप स्ट्रिंग शाब्दिक में \ वर्ण से बचें, जिसके कारण regex शाब्दिक आम तौर पर पसंद किया जाता है दोगुना करने की जरूरत है।

प्रयास करें:

'Z[\\s\\S]*?Z' 
+0

यह सही है, बैकस्लाश के साथ यह काम करता है ...! बहुत बहुत धन्यवाद, क्योंकि हमें उन्हें शाब्दिक वाक्यविन्यास के साथ आवश्यकता नहीं है, मुझे नहीं लगता था कि वे RegExp ऑब्जेक्ट के लिए अनिवार्य हैं। फिर से धन्यवाद! – KorHosik

+0

@zzzzBov हमें दूसरे मामले में '\\' से बचने की आवश्यकता क्यों है और पहले मामले में नहीं? – Geek

+3

@ गीक, पहली नियमित अभिव्यक्ति का उपयोग एक RegExp शाब्दिक है। उपयोग की जाने वाली दूसरी नियमित अभिव्यक्ति एक रेगएक्सपी ऑब्जेक्ट कन्स्ट्रक्टर है जो एक स्ट्रिंग के साथ एक तर्क के रूप में शाब्दिक है। मेरा जवाब विशेष रूप से कहता है कि आपको स्ट्रिंग अक्षर में '' \ '' वर्णों से बचने की आवश्यकता है। स्ट्रिंग अक्षर के लिए, '' \ '' का उपयोग मानों के लिए बचने के अनुक्रम बनाने के लिए किया जाता है, जबकि नियमित अभिव्यक्ति में हम बचने के अनुक्रम को * मान * मानना ​​चाहते हैं। '' "\ n" '' नई स्ट्रिंग के मान के साथ एक स्ट्रिंग बनाता है, जबकि '' "\\ n" '' '' \ n'' के मान के साथ एक स्ट्रिंग बनाता है। नियमित अभिव्यक्ति पैटर्न के लिए भेद बहुत महत्वपूर्ण है। – zzzzBov

2

मुझे लगता है कि क्योंकि आप अपने बैकस्लैश से बचने के लिए है यह है, तब भी जब एकल उद्धरण का उपयोग कर। इसे आज़माएं:

new RegExp('Z[\\s\\S]*?Z','g') 
संबंधित मुद्दे