2010-04-13 4 views
5

क्या पीसीआर-स्टाइल नियमित अभिव्यक्ति बनाना संभव है जो केवल एक बार सूची में प्रत्येक अक्षर से मेल खाता है?Regex केवल एक बार प्रत्येक पत्र का उपयोग करने के लिए?

उदाहरण के लिए, आप पत्र है, तो "lrsa" और आप के खिलाफ एक शब्द सूची से मिलान करने का प्रयास करें:

^[lrsa]*m[lrsa]*$ 

आप "LAMS" मैच के लिए जा रहे हैं (वैध), लेकिन यह भी "लामाओं" (हमारे उद्देश्यों के लिए अमान्य क्योंकि आपके पास केवल एक "ए" था)। यदि आपका पत्र सेट "lrsaa" था, तो आप "लामा" से मेल खाना चाहते हैं।

क्या यह नियमित अभिव्यक्तियों के साथ संभव है, या क्या इसे प्रोग्रामेटिक रूप से संभालना चाहिए?

+0

इस रूप में '[lrsaa] काम नहीं करेगा क्या करेंगे' '[lrsa]' के बराबर है। – Gumbo

+1

ठीक है, और यह मेरा मुद्दा है। आप [lrsa] {4} के साथ सीमित कर सकते हैं लेकिन यह अभी भी "lass" से मेल खाएगा, उदाहरण के लिए। – gtcaz

+0

आप जो भी कर सकते हैं वह उन दोनों से मेल खाता है जो आप चाहते हैं और कुछ अतिरिक्त जो आप नहीं करते हैं। अपने मैचों के पुनरावृत्ति के साथ, अवांछित अतिरिक्त फ़िल्टर करने के लिए यह छोटा होगा। – erisco

उत्तर

3

आप नकारात्मक लुक-आगे का उपयोग कर सकते हैं:

^(?!.*?(.).*?\1)[lrsa]*m[lrsa]*$ 

आप क्या चाहते हैं

+1

हां, यह काम करता है जहां प्रत्येक पत्र अद्वितीय है। बहुत उपयोगी। (मुझे इसके माध्यम से सॉर्ट करना होगा और यह समझना होगा कि यह कैसे काम करता है। इसे भी पढ़ना: http://stackoverflow.com/questions/1749437/regular-expression-negative-lookahead) एक से अधिक घटनाएं कहां हैं एक पत्र, उदाहरण: "abbcde" और आप "बेब" पर मिलान करना चाहते हैं लेकिन "डेड" नहीं? मुमकिन? – gtcaz

+0

मुझे यकीन नहीं है कि मैंने आपको सही ढंग से समझा है, लेकिन शायद यह चाल करेगा: '^ (?!। *? (डी)। *? \ 1) \ w + $' – ZyX

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