Regex दो या चार बार एक अंक से मेल खाता है


95

यह नियमित अभिव्यक्ति के बारे में एक सरल प्रश्न है, लेकिन मुझे इसका उत्तर नहीं मिल रहा है।

मैं यह निर्धारित करना चाहता हूं कि क्या कोई संख्या क्रम में दो या चार बार दिखाई देती है । मैं किस सिंटैक्स का उपयोग कर सकता हूं?

\d{what goes here?}

मैंने कोशिश की \d{2,4}, लेकिन यह अभिव्यक्ति तीन अंकों को भी स्वीकार करती है।


1
उदाहरण के लिए, दो या चार अंकों के वर्ष के लिए
डेविड आरआर

यदि स्ट्रिंग है तो आप क्या करना चाहते हैं abc 123 xyz? क्या यह मेल खाना चाहिए 12क्योंकि यह अनुक्रम में ठीक दो अंक है? या ऐसा नहीं होना चाहिए, क्योंकि 12एक बड़ा अंक अनुक्रम का हिस्सा है 123जो स्वयं 2 या 4 लंबा नहीं है? अगर मुझे अनुमान लगाना होता है, तो मुझे लगता है कि आप बाद वाला व्यवहार चाहते हैं, लेकिन यह आपके प्रश्न से स्पष्ट नहीं है। उदाहरण और / या एक स्पष्ट विनिर्देश मदद करेगा। के लिए एक ही सवाल abc 12345 def... वहाँ क्या होना चाहिए?
जीन-फ्रांकोइस कॉर्बेट

जवाबों:


146

इसके लिए कोई विशेष वाक्यविन्यास नहीं है, लेकिन इसे करने के बहुत सारे तरीके हैं:

(?:\d{4}|\d{2})    <-- alternation: four digits or two
\d{2}(?:\d{2})?    <-- two digits, and optionally two more
(?:\d{2}){1,2}     <-- two digits, times one or two

1
व्यक्तिगत रूप से, केवल \d{2}(?:\d{2})?बल्ले से समाधान के बारे में सोचा - इनमें से अच्छी किस्म - अंतिम एक, विशेष रूप से, बहुत अच्छा और स्केलेबल लग रहा है।
रात्रि

3
+1 को पहले 4 अंक और फिर 2 अंकों के मिलान के लिए उपयोग करते समय आवश्यक आदेश के प्रति सावधान रहने के लिए। इसके अलावा अन्य विविधताओं को प्रदान करने वाला अच्छा काम।
अहमद मगेद ने

9
मेरे जैसे किसी व्यक्ति के लिए, यह समझ में नहीं आया कि इसका उपयोग (?:"गैर-कैप्चरिंग समूह" (एक ऐसा समूह जो बदले हुए बयान में संदर्भित नहीं किया जाता है) शुरू होता है। आप सिर्फ पार्न्स का उपयोग कर सकते हैं लेकिन ये एक कैप्चरिंग ग्रुप बनाएंगे। यहाँ और अधिक विवरण: stackoverflow.com/questions/3512471/non-capturing-group
जेरेमी मोरिट्ज़

ये "333" और "33" के लिए समान परिणाम दिखाएंगे
Dan

1
@ डान: ये रीगेक्स पूरी स्ट्रिंग से मेल नहीं खाते हैं "333"। हो सकता है कि आप अपने regex पुस्तकालय की "मिलान मिलान विकल्प" कार्यक्षमता का उपयोग गलती से कर रहे हों, बजाय इसके कि "जांच करें कि क्या पूर्ण स्ट्रिंग मिलान करता है" कार्यक्षमता। आपको इसके प्रलेखन से परामर्श करना चाहिए।
मारख

3
(?<!\d)(\d{2}|\d{4})(?!\d)

यह करने का सही तरीका है। स्वीकृत उत्तर गलत है।

यह 3 अंकों (या 5) से मेल खाएगा। तो वो मेरी नज़र में गलत है

1) जाँच करें कि 2 या 4 अंकों के अनुक्रम से पहले कोई अंक नहीं है, या दो या चार अंकों के अनुक्रम के बाद है।

  • (<!) वाक्यविन्यास नकारात्मक रूप है

  • (?!) वाक्यविन्यास नकारात्मक रूपांतर है।

उपरोक्त मध्य स्ट्रिंग के लिए काम करेगा:

आप का उपयोग अपनी खोज स्ट्रिंग इसके चारों ओर कोई सामग्री नहीं है, तो हो सकता है ^और $शुरू करने और स्ट्रिंग एंकर के अंत:

^\d{4}$|^\d{2}$

1
मैं यह नहीं कहूंगा कि स्वीकृत उत्तर गलत है। मैं कहूंगा कि यह प्रश्न अस्पष्ट है, और यह उत्तर इसकी एक मान्य व्याख्या को संबोधित करता है। आपका उत्तर एक और मान्य व्याख्या को संबोधित करता है (जो मुझे लगता है कि एक अधिक संभावना है - लेकिन जाहिर तौर पर पूछने वाला नहीं था ...)।
जीन-फ्रांकोइस कॉर्बेट

2
"यह 3 अंकों से मेल खाएगा" बहुत सटीक नहीं है। मुझे लगता है कि आपका मतलब है "यह 3 अंकों के अनुक्रम के 2-अंकीय मिलान से मेल खाता है।"
जीन-फ्रांकोइस कॉर्बेट

1
साथ ही, आपका उत्तर 5 या अधिक अंकों के अनुक्रमों के अनुसार काफी काम नहीं करता है । मैं कोई रेगेक्स विशेषज्ञ नहीं हूं, लेकिन मुझे लगता है कि इसे ठीक करने का एक तरीका यह है कि दोनों मामलों (2- और 4 अंकों के अनुक्रम) पर नकारात्मक लुकहेड / पीछे लागू करें:(?<!\d)(\d{2}|\d{4})(?!\d)
जीन-फ्रैंकोइस कॉर्बेट

मुझे लगता है कि आप 5 अंकों के बारे में सही हैं। उस सुधार के लिए धन्यवाद। ठीक कर देंगे।
JGFMK

^\d{4}$|^\d{2}$इसे ठीक करने का एक संभावित तरीका होगा। जैसा कि^\d{2}(?!\d)|^\d{4}(?!\d)
JGFMK
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.