2009-10-16 15 views
5

मैं मूल्यों की अल्पविराम से अलग सूची को सत्यापित करने के लिए निम्न नियमित अभिव्यक्ति का उपयोग करता हूं।क्या अलग-अलग मूल्यों की अल्पविराम से अलग सूची के लिए नियमित अभिव्यक्ति है?

^Dog|Cat|Bird|Mouse(, (Dog|Cat|Bird|Mouse))*$ 

मान भी एक्सेल सेल सत्यापन में इस सूची में नीचे एक बूंद में सूचीबद्ध हैं, तो उपयोगकर्ता ड्रॉप डाउन सूची से एक मान का चयन करें, या कॉमा से अलग एक से अधिक मान में टाइप कर सकते हैं।

नियमित अभिव्यक्ति उपयोगकर्ता को स्वीकृत मानों के अलावा कुछ भी दर्ज करने से रोकने का अच्छा काम करती है, लेकिन यह उपयोगकर्ता को डुप्लीकेट दर्ज करने से नहीं रोकती है। उदाहरण के लिए, उपयोगकर्ता "कुत्ता" और "कुत्ता, बिल्ली" दर्ज कर सकता है, लेकिन उपयोगकर्ता "कुत्ता, कुत्ता" भी दर्ज कर सकता है।

क्या एक समान एकल नियमित अभिव्यक्ति का उपयोग करके डुप्लिकेट को रोकने का कोई तरीका है? दूसरे शब्दों में मुझे अनुमोदित अल्पविराम से अलग मूल्यों की एक अलग सूची को लागू करने में सक्षम होना चाहिए।

धन्यवाद!

उत्तर

10

एक backreference और एक नकारात्मक अग्रदर्शी का उपयोग करें:

^(Dog|Cat|Bird|Mouse)(, (?!\1)(Dog|Cat|Bird|Mouse))*$ 

संपादित: इस तरह के "बिल्ली, कुत्ते, डॉग" मामलों के साथ काम नहीं करेगा ... आप एक आने के लिए की आवश्यकता होगी ऐसे उदाहरणों के लिए हाइब्रिड समाधान - मुझे विश्वास नहीं है कि एक एकल रेगेक्स है जो इसे संभाल सकता है।


यहां एक और तकनीक है।

(?:(?:^|,)(Dog|Cat|Bird|Mouse))+$ 

फिर, जाँच करता है कि वह इस मैच नहीं (यह अपने मूल regex का सिर्फ एक से थोड़ा छोटा संस्करण है): आप है कि यह इस से मेल खाते हैं दो बातों की जांच करने की जरूरत है, पहले,:

(Dog|Cat|Bird|Mouse).+?\1 

ईजी

var valid = string.match(/(?:(?:^|,)(Dog|Cat|Bird|Mouse))+$/) && 
      !string.match(/(Dog|Cat|Bird|Mouse).+?\1/); 
+0

यूप, करीबी, लेकिन "बिल्ली, कुत्ता, कुत्ता" नहीं पकड़ता है। धन्यवाद! – Kuyenda

+0

मुझे नहीं पता कि यह काम करेगा या नहीं, लेकिन आप पिछला संदर्भ (?! (\ 1 | \ 2 | \ 5 | \ 8) कर सकते हैं और * से 4. बदल सकते हैं, मुझे लगता है कि यह उड़ा सकता है अगर कैप्चर समूह मौजूद नहीं हैं। मैंने कोशिश नहीं की, सिर्फ एक विचार। – Tim

+0

क्यों "\ 1 \ 2 \ 5 \ 8"? यह "\ 1 \ 2 \ 3 \ 4" नहीं होगा? धन्यवाद ! – Kuyenda

0

जे-पी, मैंने आपके नमूना नियमित अभिव्यक्तियों को संपादित करने का प्रयास किया ताकि मैं किसी भी अल्पविराम से अलग स्ट्रिंग में डुप्लीकेट ढूंढ सकूं। कुछ ऐसा:

var valid = string.match(/(?:(?:^|,)([a-z]*))+$/) && 
    !string.match(/([a-z]*).+?\1/); 

दुर्भाग्य से, मैं असफल रहा। बल मेरे साथ कमजोर है। ;)

आपकी मदद के लिए धन्यवाद।

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

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