2012-01-26 8 views
9

मैं एक वैकल्पिक अग्रदर्शी पाने के लिए कोशिश कर रहा हूँ लेकिन समस्याओं जहां जैसे ही मैं कर के रूप में यह वैकल्पिक (यह बाद एक ? जोड़ें) चल रहा है, यह अब से मेल खाता है, तब भी जब डेटा नहीं है।वैकल्पिक regex अग्रदर्शी

एक संक्षिप्त सारांश रूप में, मैं एक URI से बाहर विशिष्ट क्वेरी स्ट्रिंग पैरामीटर खींचने की कोशिश कर रहा हूँ। उदाहरण:

/.*foo.html\??(?=.*foo=([^\&]+))(?=.*bar=([^\&]+))/ 
    .exec('foo.html?foo=true&bar=baz') 

मुझे लगता है कि बाहर एक सा निकाल लेंगे:

.*foo.html\??  // filename == `foo.html` + '?' 
(?=.*foo=([^\&]+)) // find "foo=...." parameter, store the value 
(?=.*bar=([^\&]+)) // find "bar=...." parameter, store the value 

ऊपर के उदाहरण शर्त यह है कि foo और bar दोनों क्वेरी स्ट्रिंग में पैरामीटर के रूप में मौजूद तहत पूरी तरह से काम करता है। मुद्दा यह है कि मैं इन वैकल्पिक बनाने के लिए कोशिश कर रहा हूँ है, इसलिए मैं करने के लिए इसे बदल दिया है:

/.*foo.html\??(?=.*foo=([^\&]+))?(?=.*bar=([^\&]+))?/ 
           ↑     ↑ 
    Added these question marks ─┴──────────────────┘ 

और हालांकि यह अभी भी foo.html से मेल खाता है यह अब किसी भी मानकों से मेल खाता है,। कोई विचार? लुक-आगे में प्रश्न चिह्न लगाने के लिए

+0

आप इस के लिए नियमित अभिव्यक्ति क्यों प्रयोग कर रहे हैं? बस स्ट्रिंग को विभाजित करें और किसी ऑब्जेक्ट में कुंजी/मान जोड़े को स्टोर करें। – ThiefMaster

+0

@ थिफमास्टर - क्योंकि मैं चाहता हूं :) और मैं अब और भी करना चाहता हूं कि यह काम नहीं करेगा। हकीकत में, यह बस इसलिए है क्योंकि जब कोड को केवल 2 पैरा प्राप्त करने की आवश्यकता होती है तो कोड बहुत छोटा होता है। –

+0

आपको लुकहेड की आवश्यकता क्यों है? Foo.html से मिलान करने के लिए? Bar = baz और foo = true भी? – Bergi

उत्तर

4

प्रयास करें:

...((?=(?:.*foo=([^\&]+))?)... 

अजीब लग रहा है, लेकिन मुझे लगता है कि एक अच्छे दिखने वाले regex उद्देश्य :-)

भी नहीं था, आपके पास इस बारे में सोचा?

/.*foo.html\??.*(?:foo|bar)=([^\&]+).*(?:bar|foo)=([^\&]+)/ 
+1

धन्यवाद, पहला काम करता है। मुझे लगता है कि यह आवश्यक है क्योंकि इंजन पूरी तरह से बाहर (या =)? 'ऑप्टिमाइज़ कर रहा है (यानी इसे अनदेखा कर रहा है) क्योंकि एक वैकल्पिक गैर-मेलिंग रेगेक्स, ठीक है, व्यर्थ है। मैं बस कुछ और पकड़ने के लिए इसका उपयोग कर रहा हूँ। आपका दूसरा भी काम करेगा, सिवाय इसके कि इसे प्रत्येक परम वैकल्पिक बनाने के लिए कुछ बदलावों की आवश्यकता होगी, और इस तथ्य के बाद थोड़ा और तर्क है क्योंकि आपको यह पता लगाने की आवश्यकता है कि कौन सा परम है (आपको दो को हटाने की आवश्यकता होगी? : फिर उन लोगों के खिलाफ जांच करें) –

+0

वैसे भी, लुकहेड वैकल्पिक बनाना एक खाली स्ट्रिंग से मेल खाता है। – Bergi