2011-06-09 14 views
30

मैं रेगेक्स के लिए नया हूं और मैं इसे अपनी नई परियोजनाओं में से एक में काम करने की कोशिश कर रहा हूं यह देखने के लिए कि क्या मैं इसे सीख सकता हूं और इसे कौशल के अपने पुनर्वित्त में जोड़ सकता हूं। हालांकि, मैं यहां एक रोडब्लॉक मार रहा हूँ।जावास्क्रिप्ट + Regex = त्रुटि दोहराने के लिए कुछ भी नहीं?

मैं अगर उपयोगकर्ता के इनपुट .search समारोह के रूप में इतनी का उपयोग करके इसे में अवैध अक्षर है देखने के लिए कोशिश कर रहा हूँ:

if (name.search("[\[\]\?\*\+\|\{\}\\\(\)\@\.\n\r]") != -1) { 
    ... 
} 

हालांकि, जब मैं समारोह इस लाइन यह निहित है पर अमल करने की कोशिश यह, कि विशिष्ट लाइन के लिए निम्न त्रुटि फेंकता है:

Uncaught SyntaxError: Invalid regular expression: /[[]?*+|{}\()@. 

]/: Nothing to repeat 

मैं के लिए मुझे के जीवन को नहीं देख सकते कि मेरी कोड के साथ गलत है। क्या कोई मुझे सही दिशा दिखा सकता है?

उत्तर

50

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

बैकस्लैश को नियमित अभिव्यक्ति पार्सर को पारित करने के बजाय स्ट्रिंग को पढ़ने वाले कोड द्वारा व्याख्या की जा रही है। आप चाहते हैं:

"[\\[\\]?*+|{}\\\\()@.\n\r]" 

चौगुनी बैकस्लैश नोट करें। यह निश्चित रूप से जरूरी है। नियमित अभिव्यक्ति संकलक को पारित स्ट्रिंग तब @ बोहेमियन की स्ट्रिंग के समान होती है, और सही तरीके से काम करती है।

+3

बीटीडब्ल्यू, चतुर्भुज \ केवल कुछ लैंग्स में ही आवश्यक है, उदाहरण के लिए जावा हां, perl नहीं – Bohemian

2

सबसे पहले, एक चरित्र वर्ग [...]में अधिकांश वर्णों को बचने की आवश्यकता नहीं है - वे केवल शाब्दिक हैं।

तो, अपने रेगुलर एक्सप्रेशन से किया जाना चाहिए:

"[\[\]?*+|{}\\()@.\n\r]" 

यह मेरे लिए संकलित करता है।

+0

हां, यह संकलित करता है लेकिन यह सही ढंग से काम नहीं कर रहा है – Icet

+0

@ क्या अन्य उत्तर आपके लिए काम नहीं करते हैं? यदि नहीं, तो कौन सा इनपुट "काम नहीं कर रहा है"? – Bohemian

+0

उदाहरण के लिए +44 इनपुट के रूप में काम नहीं कर रहा है। यह समाधान ठीक str.replace (/ [\ - \ [\] \/\ {\} \ (\) \ * \ + \? \\\^\ $ \ |]/g, "\\ $ &"); – Icet

4

बिल्डिंग @Bohemian के बंद, मुझे लगता है कि सबसे आसान दृष्टिकोण सिर्फ एक regex शाब्दिक, जैसे उपयोग करने के लिए होगा: क्योंकि तुम भागने चरित्र से बचने के लिए की जरूरत नहीं है

if (name.search(/[\[\]?*+|{}\\()@.\n\r]/) != -1) { 
    // ... stuff ... 
} 

Regex शाब्दिक अच्छा कर रहे हैं, और कुछ आईडीई अमान्य रेगेक्स को हाइलाइट करेंगे (मेरे लिए बहुत उपयोगी है क्योंकि मैं उन्हें लगातार पेंच करता हूं)।

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