2011-07-18 15 views
6

मैं एक नियमित अभिव्यक्ति लिखने जा रहा था जो केवल तभी मेल खाएगा जब किसी स्ट्रिंग में वर्णों के कम से कम विभिन्न वर्ग होते हैं। मैं इस का उपयोग करने के लिए मजबूत पासवर्ड बनाने के लिए मेरी उपयोगकर्ताओं को बाध्य करने जा रहा था और अगर पासवर्ड निम्न में से कम से कम 3 शामिल जाँच करने के लिए चाहता था:नियमित अभिव्यक्ति मिलान समूह के कम से कम n

  • वर्ण
  • कैपिटल वर्ण
  • नंबर
  • विशेष वर्ण

एक नियमित अभिव्यक्ति लिखना जो मेल खाता है यदि उन सभी वर्गों में उपस्थित हैं तो लुकहेड का उपयोग करके तुच्छ है। हालांकि, मैं अपने सिर को "कम से कम 3" भाग के चारों ओर लपेट नहीं सकता। क्या यह भी संभव है (एक अच्छी, कॉम्पैक्ट अभिव्यक्ति में) या मुझे राक्षस अभिव्यक्ति बनाना होगा?

उत्तर

6

मुझे लगता है कि यह 4 के 3 में से प्रत्येक संभव संयोजन यह नकारात्मक अग्रदर्शी सुनिश्चित करें कि पूरी स्ट्रिंग केवल एक या चरित्र वर्गों आप सूचीबद्ध के दो से बना नहीं है बनाने के लिए इस्तेमाल करता लिस्टिंग की तुलना में अधिक कॉम्पैक्ट हो जाएगा:

(?!([a-zA-Z]*|[a-z\d]*|[^A-Z\d]*|[A-Z\d]*|[^a-z\d]*|[^a-zA-Z]*)$).* 

क्रम में, यहाँ समूह हैं:

  • कम और/या ऊपरी
  • कम और/या अंक
  • कम और/ओ r विशेष
  • ऊपरी और/या अंक
  • ऊपरी और/या विशेष
  • अंक और/या विशेष

इस regex असफल हो जायेगी अगर पूरी स्ट्रिंग (क्योंकि के नकारात्मक अग्रदर्शी में $) उपरोक्त किसी भी समूह से केवल वर्ण हैं।

+1

मुझे वास्तव में यह दृष्टिकोण पसंद है। तर्क को बदलने में भी नहीं सोचा था। बहुत बहुत धन्यवाद, बहुत चालाक! –

+1

क्या यह अभिव्यक्ति रिक्त स्थान की अनुमति नहीं दे रही है? – Rookian

+1

ऐसा करता है, [स्पेस को अनुमति देने के लिए पासवर्ड के लिए असामान्य नहीं है] (http://stackoverflow.com/questions/632167/should-users-be-allowed-to-entered-a-password-with-a- स्पेस- पर-शुरुआत या ई)। यदि आपको ऐसे संस्करण की आवश्यकता है जो रिक्त स्थान की अनुमति न दे, तो '। *' को अंत में '\ S *' में बदलें। –

2

आपको 4 में से 3 (कुल में चार अभिव्यक्तियों) के प्रत्येक संभावित संयोजन के लिए एक अभिव्यक्ति लिखनी है, और फिर | व्यक्तिगत अभिव्यक्ति एक साथ ताकि वे पास हो जाएं यदि वे मूल अभिव्यक्तियों में से कम से कम एक को पूरा करते हैं।

+1

आपकी वर्तमान नियमित अभिव्यक्ति की लंबाई 3/4 की 4 अभिव्यक्तियों में से प्रत्येक 4 अभिव्यक्तियां हैं, इसलिए आपका अंतिम परिणाम आपके वर्तमान नियमित अभिव्यक्ति के आकार के लगभग 3 x होगा। इतना भी बेकार नहीं। – Paulpro

+0

मुझे आशा थी कि मुझे ऐसा नहीं करना पड़ेगा। मुझे लगता है कि यह साफ नहीं है, खासकर जब से मुझे एक ही कक्षाओं को फिर से लिखना होगा। हालांकि आपकी स्पष्टीकरण के लिए धन्यवाद। –

+0

क्यों साफ नहीं है? एक विधि बनाएं जो इसे करता है और इसका पुन: उपयोग करता है। यह एक विशाल अपठनीय RegEx होने से काफी बेहतर है। –

0

इस समाधान के बारे में आप क्या सोचते हैं?

var str='23khkS_s'; 

var countGroups=0; 
if(str.match(/[a-z]+/)) 
    countGroups++; 
if(str.match(/[A-Z]+/)) 
    countGroups++; 
if(str.match(/[0-9]+/)) 
    countGroups++; 
if(str.match(/[[email protected]#$%*\(\)]+/)) 
    countGroups++; 

console.log(countGroups); 

1 राक्षस जैसी अभिव्यक्ति का उपयोग करने के बजाय आप 4 छोटे आरई का उपयोग कर सकते हैं। और उसके बाद वेरिएबल countGroups के साथ काम करें, जिसमें मैकेड कैरेक्टर ग्रुप की संख्या शामिल है। मुझे उम्मीद है कि यह उपयोगी है

+0

यह अच्छा होगा अगर उसने पूरे समाधान को समाप्त करने के लिए नियंत्रित किया, लेकिन मुझे संदेह है कि वह जो भी कर सकता है उसे कॉन्फ़िगरेशन के लिए टेक्स्ट फ़ील्ड में रेगेक्स लगाया जाता है। –

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

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