পূর্বের প্রদত্ত সমস্ত উত্তর প্রতিটি প্রয়োজনীয়তার জন্য পৃথক বর্ণবাদীর জন্য একই (সঠিক) কৌশল ব্যবহার করে। তবে এগুলিতে বেশিরভাগ অদক্ষতা এবং একটি সম্ভাব্য বিশাল বাগ রয়েছে যা পিছনের প্রান্তে নির্ভর করে যা আসলে পাসওয়ার্ডটি ব্যবহার করবে।
আমি স্বীকৃত উত্তর থেকে রেজেক্স দিয়ে শুরু করব:
^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\S+$).{8,}$
সবার আগে, যেহেতু জাভা সমর্থন করে \Aএবং \zআমি পুরো স্ট্রিংটি স্বতন্ত্রভাবে বৈধ হয়ে গেছে তা নিশ্চিত করার জন্য সেগুলি ব্যবহার করতে পছন্দ করি Pattern.MULTILINE। এটি পারফরম্যান্সকে প্রভাবিত করে না, তবে রেজিক্সগুলি পুনর্ব্যবহার করা হলে ভুলগুলি এড়ায়।
\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
আপনি যদি সত্যই কোনও চরিত্রের অনুমতি দিতে চান তবে কেবল বিন্দুটি ব্যবহার করা উচিত। অন্যথায়, আপনার রেজেক্সকে কেবলমাত্র সেই চরিত্রগুলিতে সীমাবদ্ধ করতে একটি (অবহেলিত) অক্ষর শ্রেণি ব্যবহার করুন যা সত্যই অনুমোদিত। যদিও এই ক্ষেত্রে এতে সামান্যতম পার্থক্য রয়েছে, অন্য কোনও কিছুর জন্য উপযুক্ত যখন বিন্দু ব্যবহার না করা খুব ভাল অভ্যাস। আমি বিপর্যয়কর ব্যাকট্র্যাকিংয়ের অনেকগুলি বিষয় দেখতে পাচ্ছি কারণ বিকাশকারী বিন্দুর চেয়ে আরও উপযুক্ত কিছু ব্যবহার করতে খুব অলস ছিলেন।
যেহেতু খুব ভাল সম্ভাবনা রয়েছে প্রাথমিক পরীক্ষাগুলি পাসওয়ার্ডের প্রথমার্ধে একটি উপযুক্ত চরিত্রের সন্ধান করবে, তাই একটি অলস কোয়ান্টিফায়ার আরও দক্ষ হতে পারে:
\A(?=\S*?[0-9])(?=\S*?[a-z])(?=\S*?[A-Z])(?=\S*?[@#$%^&+=])\S{8,}\z
তবে এখন সত্যিকারের গুরুত্বপূর্ণ ইস্যুটির জন্য: উত্তরের কোনওটির মধ্যেই আসল প্রশ্নটি ASCII তে ভাবেন এমন কেউ লিখেছেন বলে মনে হয় না। তবে জাভা স্ট্রিংগুলিতে ইউনিকোড রয়েছে। পাসওয়ার্ডগুলিতে অ-এএসসিআইআই অক্ষর অনুমোদিত? যদি সেগুলি হয় তবে কেবলমাত্র ASCII স্পেসগুলিই অনুমোদিত নয়, বা সমস্ত ইউনিকোড সাদা স্থান বাদ দেওয়া উচিত।
ডিফল্টরূপে \sকেবল এএসসিআইআই শ্বেতস্পেসের সাথে মেলে, তাই এর বিপরীতটি \Sসমস্ত ইউনিকোড অক্ষর (সাদা স্থান বা না) এবং সমস্ত নন-হোয়াইটস্পেস এএসসিআইআই অক্ষরের সাথে মেলে। যদি ইউনিকোড অক্ষর অনুমোদিত হয় তবে ইউনিকোড ফাঁকা স্থান না থাকলে, ইউনিকোড সাদা স্থান বাদ দিতে UNICODE_CHARACTER_CLASSপতাকাটি নির্দিষ্ট করা যেতে পারে \S। যদি ইউনিকোড অক্ষরগুলিকে অনুমতি না দেওয়া হয়, তবে স্থান বা নিয়ন্ত্রণের অক্ষর নয় এমন সমস্ত ASCII টি অক্ষর মিলানোর [\x21-\x7E]পরিবর্তে ব্যবহার করা যেতে পারে \S।
যা আমাদের পরবর্তী সম্ভাব্য ইস্যুতে নিয়ে আসে: আমরা কি নিয়ন্ত্রণের অক্ষরগুলিকে অনুমতি দিতে চাই? একটি সঠিক রেজেক্স লেখার প্রথম পদক্ষেপটি হ'ল আপনি কী মিল করতে চান এবং কোনটি নয় তা হুবহু নির্দিষ্ট করে দেওয়া। কেবলমাত্র 100% প্রযুক্তিগতভাবে সঠিক উত্তরটি হ'ল প্রশ্নের পাসওয়ার্ডের স্পেসিফিকেশন অস্পষ্ট কারণ এটি নির্দিষ্ট করে না যে নিয়ন্ত্রণের অক্ষর বা অ-এএসসিআইআই অক্ষরের মতো নির্দিষ্ট বর্ণের অনুমতি দেওয়া আছে কি না।