रेगुलर एक्सप्रेशंस में AND / OR ऑपरेटर का प्रतिनिधित्व कैसे किया जाता है?


220

मैं वर्तमान में एक शब्दावली एल्गोरिथ्म प्रोग्रामिंग कर रहा हूं जो यह जांचता है कि उपयोगकर्ता ने सही तरीके से टाइप किया है या नहीं। मेरे पास निम्न स्थिति है: शब्द का सही समाधान "part1, part2" होगा। उपयोगकर्ता को "part1" (उत्तर 1), "part2" (उत्तर 2) या "part1, part2" (उत्तर 3) में प्रवेश करने में सक्षम होना चाहिए। अब मैं निम्नलिखित, स्वचालित रूप से बनाए गए रेगेक्स एक्सप्रेशन के साथ उपयोगकर्ता द्वारा दिए गए स्ट्रिंग से मिलान करने का प्रयास करता हूं:

^(part1|part2)$

यह केवल उत्तर 1 और 2 को सही मानता है जबकि उत्तर 3 गलत होगा। मैं अब सोच रहा हूँ कि क्या एक ऑपरेटर के समान है | and/orइसके बजाय वह कहता है either...or

किसी को भी इस समस्या को हल करने में मेरी मदद कर सकते हैं?


1
नियमित अभिव्यक्ति इसके लिए सबसे अच्छा समाधान नहीं हो सकता है। मैं सामान्य स्ट्रिंग विधियों का उपयोग करूँगा।
फेलिक्स क्लिंग

3
यह समस्या खराब निर्दिष्ट है। जब आप की आवश्यकता होती है तो आप पैटर्न मिलान का उपयोग क्यों कर रहे हैं, कानूनी स्ट्रिंग के एक सेट के खिलाफ एक सटीक स्ट्रिंग तुलना है? जब तक आपका रेगेक्स कंपाइलर ओ (1) ट्राई संरचना में विकल्पों का अनुकूलन नहीं करता है, जिस तरह से पर्ल का क्या होता है, तो आपको संभवतः इसके बजाय हैश सदस्यता के खिलाफ एक परीक्षण करना चाहिए। अन्य रेगेक्स इंजन अभी इस पर बहुत चालाक नहीं हैं।
tchrist

@tchrist उपयोग का मामला एक मोंगोडब $orरेगेक्स मैच हो सकता है
नादिर अब्बास

जवाबों:


284

मुझे लगता है कि आप एक regex गतिशील रूप से part1 और part2 के अलावा अन्य शब्दों को शामिल करने के लिए बनाना चाहते हैं, और आप चाहते हैं कि कोई फर्क न पड़े। यदि आप ऐसा कुछ उपयोग कर सकते हैं:

((^|, )(part1|part2|part3))+$

सकारात्मक मिलान:

part1
part2, part1
part1, part2, part3

नकारात्मक मैच:

part1,           //with and without trailing spaces.
part3, part2, 
otherpart1

4
ध्यान दें कि "part1, part" 1 भी सकारात्मक होगा। जो हमेशा वांछनीय नहीं होता है
दिमान

1
@dimaaan क्या आपने अपने उद्धरणों का गलत इस्तेमाल किया है? "part1, part1" एक मैच होगा, लेकिन "part1, part" नहीं होगा। यद्यपि आप सही हैं कि इस तरह के परिदृश्य को ओपी के आवेदन के लिए इस समाधान द्वारा कवर नहीं किया गया है, जहां वह जाँच कर रहा है कि क्या परीक्षण-स्ट्रिंग में शब्दावली में शब्द शामिल हैं, मेरा मानना ​​है कि वह एक शब्द होने पर भी एक सकारात्मक मैच चाहता है। दोहराया गया। यह शब्द अब भी शब्दावली का हिस्सा होगा, भले ही आपको इसके कितने उदाहरण मिले हों।
गौते लोकेन

30
'^(part1|part2|part1,part2)$'

क्या यह काम करता है?


1
जाहिर है। रेगेक्स को मैच के लिए पूरे स्ट्रिंग की आवश्यकता होती है (^, $)
ग्लासपिल

5

क्या यह विकल्प के बिना काम करता है?

^((part)1(, \22)?)?(part2)?$

या यह क्यों नहीं?

^((part)1(, (\22))?)?(\4)?$

पहला सभी परिस्थितियों के लिए दूसरा काम करता है, लेकिन part2(GNU sed 4.1.5 का उपयोग करके)


4

रेगेक्स में विशेषज्ञ नहीं, लेकिन आप कर सकते हैं ^((part1|part2)|(part1, part2))$। शब्दों में: "भाग 1 या भाग 2 या दोनों"


2

या आप इसका उपयोग कर सकते हैं:

^(?:part[12]|(part)1,\12)$
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.