पहले दिए गए सभी उत्तर प्रत्येक आवश्यकता के लिए एक अलग लुकहेड का उपयोग करने के लिए एक ही (सही) तकनीक का उपयोग करते हैं। लेकिन उनमें कुछ अक्षमताओं और संभावित रूप से बड़े पैमाने पर बग होते हैं, जो कि पीछे के छोर पर निर्भर करते हैं जो वास्तव में पासवर्ड का उपयोग करेंगे।
मैं स्वीकार किए जाते हैं जवाब से regex के साथ शुरू करेंगे:
^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\S+$).{8,}$
सबसे पहले, चूंकि जावा समर्थन करता है \Aऔर \zमैं उन का उपयोग करना पसंद करता हूं ताकि यह सुनिश्चित हो सके कि संपूर्ण स्ट्रिंग स्वतंत्र रूप से मान्य है Pattern.MULTILINE। यह प्रदर्शन को प्रभावित नहीं करता है, लेकिन जब regexes को पुनर्नवीनीकरण किया जाता है तो गलतियों से बचा जाता है।
\A(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\S+$).{8,}\z
यह जाँचना कि पासवर्ड में व्हॉट्सएप नहीं है और इसकी न्यूनतम लंबाई की जाँच एक ही पास में की जा सकती है, एक बार में सभी का उपयोग करके {8,}शॉर्टहैंड पर वैरिएबल क्वांटिफायर डालकर \Sअनुमत वर्णों को सीमित करता है:
\A(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])\S{8,}\z
यदि प्रदान किए गए पासवर्ड में स्थान नहीं है, तो सभी चेक किए जाएंगे, केवल अंतिम चेक को अंतरिक्ष में विफल होने के लिए। इसके साथ सभी बिंदुओं को बदलकर इससे बचा जा सकता है \S:
\A(?=\S*[0-9])(?=\S*[a-z])(?=\S*[A-Z])(?=\S*[@#$%^&+=])\S{8,}\z
डॉट का उपयोग केवल तभी किया जाना चाहिए जब आप वास्तव में किसी भी चरित्र को अनुमति देना चाहते हैं। अन्यथा, अपने regex को केवल उन वर्णों तक सीमित करने के लिए (उपेक्षित) वर्ण वर्ग का उपयोग करें जिन्हें वास्तव में अनुमति है। हालाँकि इस मामले में बहुत कम फर्क पड़ता है, लेकिन जब कुछ और उपयुक्त हो तो डॉट का उपयोग न करना एक बहुत अच्छी आदत है। मैं अब तक भयावह बैकट्रैकिंग के कई मामलों को देखता हूं क्योंकि डेवलपर बहुत अधिक आलसी था।
चूंकि एक अच्छा मौका है प्रारंभिक परीक्षणों में पासवर्ड के पहले भाग में एक उपयुक्त चरित्र मिलेगा, एक आलसी क्वांटिफायर अधिक कुशल हो सकता है:
\A(?=\S*?[0-9])(?=\S*?[a-z])(?=\S*?[A-Z])(?=\S*?[@#$%^&+=])\S{8,}\z
लेकिन अब वास्तव में महत्वपूर्ण मुद्दे के लिए: कोई भी उत्तर इस तथ्य का उल्लेख नहीं करता है कि मूल प्रश्न किसी ऐसे व्यक्ति द्वारा लिखा गया लगता है जो ASCII में सोचता है। लेकिन जावा स्ट्रिंग्स में यूनिकोड हैं। क्या पासवर्ड में गैर-एएससीआईआई पात्रों की अनुमति है? यदि वे हैं, तो केवल ASCII रिक्त स्थान हैं, या सभी यूनिकोड व्हाट्सएप को बाहर रखा जाना चाहिए।
डिफ़ॉल्ट रूप से \sकेवल ASCII व्हाट्सएप से मेल खाता है, इसलिए इसका व्युत्क्रम \Sसभी यूनिकोड वर्णों (व्हाट्सएप या नहीं) और सभी गैर-व्हाट्सएप ASCII वर्णों से मेल खाता है। यदि यूनिकोड वर्णों की अनुमति है लेकिन यूनिकोड रिक्त स्थान नहीं हैं, तो UNICODE_CHARACTER_CLASSध्वज \Sको यूनिकोड व्हाट्सएप को बाहर करने के लिए निर्दिष्ट किया जा सकता है । यदि यूनिकोड वर्णों की अनुमति नहीं है, तो [\x21-\x7E]इसका उपयोग \Sसभी ASCII वर्णों से मेल खाने के बजाय किया जा सकता है जो एक स्थान या नियंत्रण वर्ण नहीं हैं।
जो हमें अगले संभावित मुद्दे पर लाता है: क्या हम नियंत्रण पात्रों को अनुमति देना चाहते हैं? एक उचित रेगेक्स लिखने में पहला कदम यह निर्दिष्ट करना है कि आप क्या मेल खाना चाहते हैं और क्या नहीं। केवल 100% तकनीकी रूप से सही उत्तर है कि प्रश्न में पासवर्ड विनिर्देश अस्पष्ट है क्योंकि इसमें यह नहीं बताया गया है कि कुछ वर्णों जैसे कि नियंत्रण वर्ण या गैर-ASCII वर्णों की अनुमति है या नहीं।