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


298

मेरी निम्न अभिव्यक्ति है:

^/[a-z0-9]+$

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

हालाँकि, मैं चाहूंगा कि इस तरह के कुछ स्ट्रिंग मानों को छोड़ दें /ignoremeऔर /ignoreme2

मैंने कुछ वेरिएंट आज़माए हैं, लेकिन काम करने के लिए कोई भी चीज़ नहीं मिल रही है!

मेरा सबसे ताज़ा प्रयास था

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

किसी भी सहायता की काफी सराहना की जाएगी :-)


जवाबों:


376

यहाँ एक और तरीका है (एक नकारात्मक रूप से आगे का उपयोग करके ):

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

नोट: केवल एक कैप्चरिंग एक्सप्रेशन है ([a-z0-9]+):।


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

इस तरह लगता है एक और सवाल है। Regexp जो आपको दिखता है, वह क्वेरी स्ट्रिंग - टेस्ट को कैप्चर करेगा और देखेगा कि आपका क्वेरी स्ट्रिंग साथ आता है या नहीं। इसके अलावा - (\?(.+))?$तेजी से होना चाहिए। मैं गति के बारे में बहुत ज्यादा चिंता नहीं करूँगा।
सेठ १

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

1
मैं मार्क के पुनर्मूल्यांकन की पुष्टि करता हूं;) - उदाहरण के लिए, Pycharm जावा-आधारित है, है ना? इसलिए, Pycharm की खोज में एलिक्स की खोज पर एलिक्स का समाधान काम करता है, दूसरा नहीं करता है।
प्रशंसक

43

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

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

आप जितना चाहें उतने उपेक्षित शब्दों को जोड़ सकते हैं, यहाँ एक सरल PHP कार्यान्वयन है:

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

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

मुझे लगा कि लुक-बैक के लिए एक निश्चित-चौड़ाई पैटर्न की आवश्यकता है?
सिमोन

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

यह स्मार्ट है, लेकिन अगर किसी दूसरे शब्द के अंत में अनदेखा शब्द है, तो यह मेरे लिए विफल है। यानी यदि आप अनदेखे शब्दों में से एक के रूप में 'a' जोड़ते हैं, तो किसी भी शब्द का अंत होता है जिसे अनदेखा किया जाता है
singmotor

21

जैसा कि आप दोनों शब्दों को बाहर करना चाहते हैं, आपको एक संयोजन की आवश्यकता है:

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

अब दोनों ही स्थितियों को सही होना चाहिए (न तो अज्ञानी होना चाहिए और न ही अज्ञानता 2 की अनुमति है) एक मैच होना चाहिए।


1
यह ऊपर दिए गए छोटे के बराबर है जो कि विकल्पों के समूह का नकारात्मक रूप है।
क्रिस डेफ

4
@ क्रिस नहीं, वास्तव में नहीं। सेठ का हल कुछ इस तरह से मेल नहीं खाता /ignoremenotजैसा कि /उसके बाद है ignoreme
गुमबो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.