2010-01-16 14 views
160

बाहर करने के लिए मैं एक नियमित अभिव्यक्ति के रूप में निम्नानुसार है:के लिए रेगुलर एक्सप्रेशन एक शब्द/स्ट्रिंग

^/[a-z0-9]+$ 

इस तरह के /hello या /hello123 के रूप में तार से मेल खाता है।

हालांकि, मैं इसे /ignoreme और /ignoreme2 जैसे कुछ स्ट्रिंग मानों को बाहर करना चाहता हूं।

मैंने कुछ प्रकारों की कोशिश की है लेकिन काम करने के लिए कोई प्रतीत नहीं होता है! अब

^/(?!ignoreme$)(?!ignoreme2$)[a-z0-9]+$ 

:

मेरे नवीनतम कमजोर प्रयास

^/(((?!ignoreme)|(?!ignoreme2))[a-z0-9])+$ 

कोई मदद कृतज्ञता की सराहना की जाएगी था :-)

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/1395177/regex-to-exclude-a- स्पेसिफिक- स्ट्रिंग-constant –

उत्तर

215

यहाँ अभी तक एक और तरीका है: (क negative look-ahead का उपयोग कर):

^/(?!ignoreme|ignoreme2|ignoremeN)([a-z0-9]+)$ 

नोट: केवल एक ही कैप्चरिंग अभिव्यक्ति है: ([a-z0-9]+)

+1

शानदार दिखाई देता है, ऐसा लगता है कि यह चाल चल रही है। मुझे वास्तव में यूआरएल पुनर्लेखन के लिए इस नियम की आवश्यकता है और मैं "छवियों", "सीएसएस" और "जेएस" फ़ोल्डर को अनदेखा करना चाहता हूं। तो मेरा नियम इस प्रकार है: ^/(?! सीएसएस | जेएस | छवियां) ([एजे] +) /? (\? (। +))? $ और यह /Profile.aspx?id= पर फिर से लिखता है $ 1 और $ 3 क्या यह नियम सही तरीके से काम करेगा और क्वेरी स्ट्रिंग को भी प्रसारित करेगा? तो अगर कोई http://mydomain.com/hello?abc=123 पर जाता है तो मैं इसे http://mydomain.com/Profile.aspx?id=hello&abc=123 पर फिर से लिखना चाहता हूं। मैं भी एक हूं मूल अनुरोध में क्वेरीस्ट्रिंग को कैप्चर करने के अंत में (। +) के प्रदर्शन के बारे में कुछ अनिश्चित है। – romiem

+0

इस तरह लगता है एक और सवाल है। आपके द्वारा देखे गए रेगेक्सपी क्वेरी स्ट्रिंग को कैप्चर करेंगे - परीक्षण करें और देखें कि आपकी क्वेरी स्ट्रिंग के साथ आता है या नहीं। इसके अलावा - '(\? (। +))?$ 'तेजी से होना चाहिए। मैं गति के बारे में ज्यादा चिंता नहीं करता। – Seth

+0

यह मेरे लिए काम नहीं करता था, जबकि एलिक्स एक्सेल के समाधान ने काम किया था। मैं जावा की 'java.util.regex.Pterntern' कक्षा का उपयोग कर रहा हूं। –

10

आप दोनों शब्दों को बाहर निकालना चाहते हैं तो आपसे एक conjuction की जरूरत दोनों स्थितियों को सत्य होना चाहिए (न तो ignoreme और न ही ignoreme2 अनुमति है) atch।

+0

यह ऊपर के छोटे से बराबर है जो विकल्पों के एक सेट का नकारात्मक दिखना है । – ChrisF

+1

@ChrisF नहीं, वास्तव में नहीं। सेठ का समाधान '/ ignoremenot' जैसे कुछ से मेल नहीं खाता क्योंकि '' '' ignoreme' के बाद होता है। – Gumbo

26

यह करना चाहिए:

^/\b([a-z0-9]+)\b(?<!ignoreme|ignoreme2|ignoreme3) 

आप कर सकते हैं के रूप में ज्यादा ध्यान नहीं दिया शब्द जोड़ के रूप में आप चाहें, तो यहाँ एक सरल पीएचपी दिया गया है:

$ignoredWords = array('ignoreme', 'ignoreme2', 'ignoreme...'); 

preg_match('~^/\b([a-z0-9]+)\b(?<!' . implode('|', array_map('preg_quote', $ignoredWords)) . ')~i', $string); 
+0

मैंने सोचा कि पीछे-पीछे एक निश्चित चौड़ाई पैटर्न की आवश्यकता है? – simon

+0

@ सिमॉन: क्या यह है? –

+2

@AlixAxel यह करता है, लेकिन स्मार्ट रेगेक्स libs विकल्पों के लिए अलग-अलग लंबाई के साथ एक विकल्प की अनुमति देगा (और सबसे लंबे समय तक उपयोग करें), जब तक कि प्रत्येक विकल्प निश्चित लंबाई की हो। – ChrisF

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