एक वैध वर्ष के लिए परीक्षण करने के लिए नियमित अभिव्यक्ति मैच


89

एक मान को देखते हुए मैं यह जांचने के लिए इसे सत्यापित करना चाहता हूं कि क्या यह वैध वर्ष है। मेरा मानदंड सरल है जहां मूल्य 4वर्णों के साथ पूर्णांक होना चाहिए । मुझे पता है कि यह सबसे अच्छा समाधान नहीं है क्योंकि यह वर्षों पहले अनुमति नहीं देगा 1000और इस तरह के वर्षों की अनुमति देगा 5000। यह मापदंड मेरे वर्तमान परिदृश्य के लिए पर्याप्त है।

जो मैं लेकर आया हूं वह है

\d{4}$

जबकि यह काम करता है यह नकारात्मक मूल्यों को भी अनुमति देता है।

मैं यह कैसे सुनिश्चित करूं कि केवल सकारात्मक पूर्णांक की अनुमति है?


fwiw I ने इन श्रेणियों को स्वचालित रूप से बनाने के लिए एक नोड.जेएस प्रोजेक्ट, टू-रेगेक्स-रेंज बनाया। यदि आप वर्षों की श्रेणी के लिए परीक्षण करने के लिए रेगेक्स उत्पन्न करने की आवश्यकता है तो यह कठिन लग सकता है।
jonschlinkert

अपनी मान्यता को 4 अंकों के वर्षों तक सीमित क्यों करें? longnow.org
दान मंदिर

जवाबों:


76

आपको ^निम्न के रूप में एक स्टार्ट एंकर जोड़ना होगा :

^\d{4}$

आपका रेगेक्स स्ट्रिंग्स \d{4}$से मेल खाएगा जो 4 अंकों के साथ समाप्त होता है । इसलिए इनपुट -1234को स्वीकार किया जाएगा।

स्टार्ट एंकर को जोड़कर आप केवल उन स्ट्रिंग्स से मेल खाते हैं जो 4 अंकों के साथ शुरू और समाप्त होते हैं, जिसका प्रभावी अर्थ है कि उनमें केवल 4 अंक होने चाहिए।


2
अरे नहीं! खदान इतनी त्रुटिपूर्ण थी कि इसे स्वीकार भी कर लिया जाता whateverblahblah2323। अब मैं समझता हूँ कि थोड़ा सीखना खतरनाक क्यों है: ओ
रणहिरु जूडे कोरे '

62
यह वर्ष 10,000 में टूट जाएगा।
sferik

16
@ सुरक्षा: कोई फर्क नहीं पड़ता। मूल पोस्टर में विशेष रूप से कहा गया था कि वह चार वर्णों की जांच करना चाहता था। उन्होंने यह नहीं कहा कि वह चाहते थे कि वर्ष 10,000 वैध इनपुट हो, इसलिए स्वीकार 10000करना एक बग होगा।
अंक

4
@sferik: कार्यक्रम तब तक सदियों के लिए चला जाएगा। यदि नहीं, तो भविष्य में 9,000 वर्षों के लिए चिंता करना सबसे अच्छा है। YAGNI के सिद्धांत के बाद, दृष्टिकोण वैध है।
फिल

182

साल 1000 से 2999 तक

^[12][0-9]{3}$

1900-2099 के लिए

^(19|20)\d{2}$

14
यह एक बेहतर समाधान है
mk_89

10
मैं गैर-कैप्चरिंग समूह का उपयोग करना बेहतर हूं:^(?:19|20)\d{2}$
एल्डारल एग्रोवोव

मैं 2011 और 2099 के बीच 4 अंकों का वर्ष कैसे मान्य करूंगा?
mcquaim

(19|20)\d{2}जन्मतिथि प्रारूप को मान्य करने के लिए मैं अपने रेगेक्स को कैसे जोड़ सकता हूं ? यह मेरी regex है /^[0-9]{1,2}\/(0[1-9])|(1[0-2])\/[0-9]{4}$/मुझे लगता है कि साल हमेशा 4 अंक सुनिश्चित करना चाहते हैं और 19 सूख शुरू होता है ** या 20 **
ltdev

उपयोग ^ (19 | 2 [0-9]) \ d {2} $ वर्ष के लिए 1900 - 2999
मार्कोज़ेन

22

इस प्रश्न का "स्वीकृत" उत्तर गलत और मायोपिक दोनों है।

यह गलत है कि यह ऐसे तार से मेल खाएगा 0001, जो एक वैध वर्ष नहीं है।

यह मायोपिक है कि यह 9999 से ऊपर किसी भी मूल्य से मेल नहीं खाएगा। क्या हम पहले ही वाई 2 के के सबक भूल गए हैं ? इसके बजाय, नियमित अभिव्यक्ति का उपयोग करें:

^[1-9]\d{3,}$

यदि आपको भविष्य में वर्षों के अलावा, अतीत में वर्षों का मिलान करने की आवश्यकता है, तो आप किसी भी सकारात्मक पूर्णांक से मेल खाने के लिए इस नियमित अभिव्यक्ति का उपयोग कर सकते हैं:

^[1-9]\d*$

यहां तक ​​कि अगर आप अतीत से तारीखों की उम्मीद नहीं करते हैं, तो आप इस नियमित अभिव्यक्ति का उपयोग करना चाह सकते हैं, वैसे ही जब कोई किसी समय मशीन पर आक्रमण करता है और अपने सॉफ़्टवेयर को उनके साथ वापस लेना चाहता है।

नोट: यह नियमित अभिव्यक्ति सभी वर्षों से मेल खाएगी, जिसमें वर्ष 1 से पहले के लोग भी शामिल हैं, क्योंकि वे आमतौर पर एक नकारात्मक पूर्णांक के बजाय बीसी पदनाम के साथ प्रतिनिधित्व करते हैं। बेशक, यह सम्मेलन अगले कुछ सदियों में बदल सकता है, इसलिए आपका सबसे अच्छा विकल्प किसी भी पूर्णांक के साथ मेल खाना है - सकारात्मक या नकारात्मक - निम्नलिखित नियमित अभिव्यक्ति के साथ:

^-?[1-9]\d*$

3
नहीं, यह संभव नहीं होगा। लेकिन किसी को (पुरातत्वविज्ञानी? इतिहासकार?) को 8000 साल पहले के वर्षों का मिलान करना पड़ सकता है। : D और Doc Brown को इसकी आवश्यकता हो सकती है ...
Jaime

1
मैंने इसका उपयोग 1000-9999 तक सीमित करने के लिए किया था ^ [1-9] \\ d {3} $ thats क्योंकि एप्लिकेशन को हमें डेटा प्रदान करना है, केवल 4 अंकों की संख्या स्वीकार करना है :(
MatPag

बहुत बढ़िया जवाब। मैं इसे वर्ष 0 के रूप में स्वीकार करने के लिए निम्नलिखित बनाऊंगा: ^ (-? [(1-9] \ d * | 0) $
कोस्टा कांटो

10

यह 1900 से 2099 के लिए काम करता है:

/(?:(?:19|20)[0-9]{2})/

मुझे ऐसा लग रहा है कि यह केवल 2099 पर जाएगा। BTW ओपी पूछ रहा है कि केवल सकारात्मक 4 अंकों की संख्या की अनुमति कैसे दी जाए।
डीनॉक

bah, 2099 का मेरा मतलब है। धन्यवाद। और अब मुझे सकारात्मक पूर्णांक भाग दिखाई देता है।
jonschlinkert

मैंने इन रेंजों को स्वचालित रूप से बनाने के लिए एक प्रोजेक्ट बनाया, टू-रेगेक्स-रेंज
जॉन्सक्लिंर्ट

5

वर्ष 1970-2019 के लिए @ r92 उत्तर पर निर्माण:

(19[789]\d|20[01]\d)

आपका जवाब अनुमति देता है197999
avalanche1 16

मुझे नहीं लगता कि यह करता है ... रेगेक्स मैच संख्या का पहला भाग 19 से शुरू होता है, फिर 7,8 या 9 में से कोई भी, जिसके बाद एक सिंगल नंबर आता है। रेगेक्स 19[789]\d\d\dकी अनुमति होगी197999
रेनॉड

1
/(19[789]\d|20[01]\d)/.test(1970324) >> true
avalanche1

हां, यह पहले 4 नंबरों ( 1970) से मेल खाएगा , आखिरी नहीं 3. किस बारे में (19[789]\d|20[01]\d)[^0-9]? यह मैच होगा 1970 324लेकिन नहीं1970324
रेनॉड

1
मुझे यह एक फिल्म वर्ष के लिए एक फ़ाइल नाम से खोजने के लिए उपयोगी लगा ... इस मामले में हम 1930 के दशक से सामान चाहते हैं ... लेकिन हम तब 1024 को बाहर कर देते हैं जो वीडियो की गुणवत्ता के लिए अंत में जोड़ा जाता है
एड्रियन हम

2

सिद्धांत रूप में 4 अंकों का विकल्प सही है। लेकिन व्यवहार में यह 1900-2099 रेंज के लिए बेहतर हो सकता है।

इसके अतिरिक्त यह गैर-कैप्चरिंग समूह होना चाहिए। कई टिप्पणियाँ और उत्तर समूहीकरण पर कब्जा करने का प्रस्ताव देते हैं जो IMHO के लिए उचित नहीं है। क्योंकि मिलान के लिए यह काम कर सकता है, लेकिन रेगेक्स का उपयोग करके मैचों को निकालने के लिए यह 4 अंकों की संख्या और दो अंकों (19 और 20) की संख्या को भी पैरेन्थेसिस के कारण निकाल देगा।

यह गैर-कैप्चरिंग समूहों का उपयोग करके सटीक मिलान के लिए काम करेगा:

(?:19|20)\d{2}


1

आप जैसे sth के साथ जा सकते हैं [ ^-]\d{4}$: आप -अपने 4 अंकों से पहले माइनस साइन को रोकते हैं ।
आप भी उपयोग कर सकते हैं ^\d{4}$के साथ ^स्ट्रिंग की शुरुआत को पकड़ने के लिए। यह वास्तव में आपके परिदृश्य पर निर्भर करता है ...


1

एक वर्ष में एक स्ट्रिंग का परीक्षण करने के लिए जिसमें वर्ष के साथ अन्य शब्द शामिल हैं, आप निम्नलिखित regex का उपयोग कर सकते हैं: \ b \ d {{}} / b


यह वही था जिसकी मुझे आवश्यकता थी, स्वीकृत उत्तर मान्य PCRE नहीं लगता है।
प्रोमेथियस

1

उपयोग;

^(19|[2-9][0-9])\d{2}$ 

वर्ष 1900 - 9999 के लिए।

9999 और उसके बाद के लिए चिंता करने की कोई ज़रूरत नहीं है - AI तब तक सभी प्रोग्रामिंग कर देगा !!! hehehehe

आप अपने regex का परीक्षण https://regex101.com/ पर कर सकते हैं

गैर-कैप्चरिंग समूहों के बारे में अधिक जानकारी (ऊपर एक टिप्पणी में उल्लिखित) यहां http://www.manifold.net/doc/radian/why_do_non-capture_groups_exist_.htm


0

आप अपने पूर्णांक को एक स्ट्रिंग में बदल सकते हैं। जैसे कि माइनस साइन अंकों से मेल नहीं खाएगा, आपके पास कोई नकारात्मक वर्ष नहीं होगा।


0

मैं जावा में इस रेगेक्स का उपयोग करता हूं ^(0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])[/](19|[2-9][0-9])[0-9]{2}$

1900 से 9999 तक काम करता है


0

/ ^ \ d {4} $ / यह जांच करेगा कि क्या एक स्ट्रिंग में केवल 4 नंबर हैं। इस परिदृश्य में, एक वर्ष 989 इनपुट करने के लिए, आप इसके बजाय 0989 दे सकते हैं।


0

यदि आपको YYYY या YYYYMMDD से मिलान करना है तो आप इसका उपयोग कर सकते हैं:

^((?:(?:(?:(?:(?:[1-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:[2468][048]|[13579][26])00))(?:0?2(?:29)))|(?:(?:[1-9]\d{3})(?:(?:(?:0?[13578]|1[02])(?:31))|(?:(?:0?[13-9]|1[0-2])(?:29|30))|(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\d|2[0-8])))))|(?:19|20)\d{2})$

0

आप इसे भी इस्तेमाल कर सकते हैं।

([0-2][0-9]|3[0-1])\/([0-1][0-2])\/(19[789]\d|20[01]\d)

वे साल-दर-साल मैच करना चाहते हैं। इसके अलावा अपने regex मैचों 00/00/2000या 31/02/1999कई और झूठी तारीखों।
पूर्ण

आपकी मदद कर सकता है ([0-2] [0-9] | 3 [0-1]) \ / ([0-1] [0-2]) \ / (19 [789] \ d | 20 [01] ] \ d)
रणजीत चौहान

(0[1-9]|1[0-2])महीने के लिए एक बेहतर अभिव्यक्ति है
EZ-C
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.