এই প্রশ্নটি ভাইরাল হতে শুরু করে এবং প্রচুর আকর্ষণীয় পরামর্শ হাজির।
হ্যাঁ, হাতে হাতে লেখা কঠিন। সুতরাং একটি সহজ সমাধান একটি টেমপ্লেট ব্যবহার করা হয়। যদিও ফলস্বরূপ রেজেক্স সর্বাধিক অনুকূল নাও হতে পারে তবে এটি বজায় রাখা এবং / অথবা পরিবর্তন করা সহজ হবে এবং ফলাফলটির উপর ব্যবহারকারীর আরও ভাল নিয়ন্ত্রণ থাকবে। এটা সম্ভব যে আমি কিছু মিস করেছি, সুতরাং যে কোনও গঠনমূলক সমালোচনা সহায়ক হবে।
এই লিঙ্কগুলি আকর্ষণীয় হতে পারে: কোনও স্ট্রিংয়ে কমপক্ষে 2 অঙ্ক 2 অক্ষরের সাথে মিল করুন , নিয়মিত এক্সপ্রেশন ভাষা , ক্যাপচারিং গ্রুপগুলি
আমি (?=(?:.*?({type})){({count})})এসওতে দেখেছি এমন সমস্ত রেগেক্সের ভিত্তিতে এই টেম্পলেটটি ব্যবহার করছি । পরবর্তী পদক্ষেপটি প্রয়োজনীয় প্যাটার্নটি প্রতিস্থাপন করছে ( number,special character ...) এবং দৈর্ঘ্যের জন্য কনফিগারেশন যুক্ত করছে।
আমি রেজিএক্স পাসওয়ার্ডরেজজেনারেটর.সি . রাইজ করার জন্য একটি ছোট্ট ক্লাস করেছি
একটি উদাহরণ:
string result = new PasswordRegexGenerator ( )
.UpperCase ( 3, -1 ) // ... {3,}
.Number ( 2, 4 ) // ... {2,4}
.SpecialCharacter ( 2 ) // ... {2}
.Total ( 8,-1 )
.Compose ( );
/// <summary>
/// Generator for regular expression, validating password requirements.
/// </summary>
public class PasswordRegexGenerator
{
private string _elementTemplate = "(?=(?:.*?({type})){({count})})";
private Dictionary<string, string> _elements = new Dictionary<string, string> {
{ "uppercase", "[A-Z]" },
{ "lowercase", "[a-z]" },
{ "number", @"\d" },
{ "special", @"\W" },
{ "alphanumeric", @"\w" }
};
private StringBuilder _sb = new StringBuilder ( );
private string Construct ( string what, int min, int max )
{
StringBuilder sb = new StringBuilder ( _elementTemplate );
string count = min.ToString ( );
if ( max == -1 )
{
count += ",";
}
else if ( max > 0 )
{
count += "," + max.ToString();
}
return sb
.Replace ( "({type})", what )
.Replace ( "({count})", count )
.ToString ( );
}
/// <summary>
/// Change the template for the generation of the regex parts
/// </summary>
/// <param name="newTemplate">the new template</param>
/// <returns></returns>
public PasswordRegexGenerator ChangeRegexTemplate ( string newTemplate )
{
_elementTemplate = newTemplate;
return this;
}
/// <summary>
/// Change or update the regex for a certain type ( number, uppercase ... )
/// </summary>
/// <param name="name">type of the regex</param>
/// <param name="regex">new value for the regex</param>
/// <returns></returns>
public PasswordRegexGenerator ChangeRegexElements ( string name, string regex )
{
if ( _elements.ContainsKey ( name ) )
{
_elements[ name ] = regex;
}
else
{
_elements.Add ( name, regex );
}
return this;
}
#region construction methods
/// <summary>
/// Adding number requirement
/// </summary>
/// <param name="min"></param>
/// <param name="max"></param>
/// <returns></returns>
public PasswordRegexGenerator Number ( int min = 1, int max = 0 )
{
_sb.Append ( Construct ( _elements[ "number" ], min, max ) );
return this;
}
public PasswordRegexGenerator UpperCase ( int min = 1, int max = 0 )
{
_sb.Append ( Construct ( _elements[ "uppercase" ], min, max ) );
return this;
}
public PasswordRegexGenerator LowerCase ( int min = 1, int max = 0 )
{
_sb.Append ( Construct ( _elements[ "lowercase" ], min, max ) );
return this;
}
public PasswordRegexGenerator SpecialCharacter ( int min = 1, int max = 0 )
{
_sb.Append ( Construct ( _elements[ "special" ], min, max ) );
return this;
}
public PasswordRegexGenerator Total ( int min, int max = 0 )
{
string count = min.ToString ( ) + ( ( max == 0 ) ? "" : "," + max.ToString ( ) );
_sb.Append ( ".{" + count + "}" );
return this;
}
#endregion
public string Compose ()
{
return "(" + _sb.ToString ( ) + ")";
}
}