2015-04-21 5 views
42

http://regexr.com/3ars8यह रेगेक्स कैरेट की अनुमति क्यों दे रहा है?

^(?=.*[0-9])(?=.*[A-z])[0-9A-z-]{17}$ 

से मेल खाना चाहिए "17 अक्षरांकीय वर्ण, कम से कम एक पत्र और कम से कम एक अंक शामिल होना चाहिए हाइफ़न भी अनुमति"

यह सही ढंग से मिलान करेंगे:

ABCDF31U100027743 

और मिलान करने के लिए सही ढंग से गिरावट:

AB$DF31U100027743 
,210

(और लगभग किसी भी अन्य गैर-शब्दसंख्यात्क वर्ण)

लेकिन जाहिरा तौर पर अनुमति देगा:

AB^DF31U100027743 

उत्तर

111

अपने चरित्र वर्ग क्योंकि [A-z] मैचों इस प्रतीक।

[A-z][, \, ], ^, _, `, और अंग्रेजी अक्षरों से मेल खाता है।

दरअसल, यह एक आम गलती है। आपको केवल अंग्रेज़ी अक्षरों की अनुमति देने के लिए [a-zA-Z] का उपयोग करना चाहिए।

screenshot from Expresso showing the ASCII table, where you can see what the [A-z] range actually covers

तो, this regex (i विकल्प के साथ) अपने स्ट्रिंग पर कब्जा नहीं होगा:

यहाँ Expresso से एक दृश्य, दिखा क्या सीमा [A-z] वास्तव में शामिल किया गया है।

^(?=.*[0-9])(?=.*[a-z])[0-9a-z-]{17}$ 

मेरी राय में, यह हमेशा Ignorecase विकल्प का उपयोग करने इस तरह के एक समस्या से बचने और regex छोटा करने के लिए सुरक्षित है।

5

आप ए-जेड (पूंजी 'ए' को कम 'z' के माध्यम से अनुमति दे रहे हैं)। आप यह नहीं कहते कि आप किस रेगेक्स पैकेज का उपयोग कर रहे हैं, लेकिन यह जरूरी नहीं है कि ए-जेड और ए-जेड संगत हैं; बीच में अन्य पात्र हो सकते हैं। इसके बजाय इसे आजमाएं:

^(?=.*[0-9])(?=.*[A-Za-z])[0-9A-Za-z-]{17}$ 

यह रेगेक्सपाल में मेरे लिए आपके मानदंडों को पूरा करता प्रतीत होता है।

15

रेगेक्स अंतरिक्ष से एसीसीआईआई प्रिंट करने योग्य पात्रों को टिल्ड रेंज तक उपयोग करता है।

जब भी हम [A-z] टोकन का उपयोग करते हैं, तो यह निम्न तालिका हाइलाइट किए गए वर्णों से मेल खाता है। अगर हम [ -~] टोकन का उपयोग करते हैं तो यह SPACE से टिल्डे तक शुरू होता है।

enter image description here

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