Search code examples
c#regexregex-lookarounds

Regex: creating string dynamically


Need regular expression to check the password policy

I have a model:

"password_settings": {
    "enable_password_max_length": false,
    "enable_password_min_length": false,
    "enable_min_number_of_upper": false,
    "enable_min_number_of_lower": false,
    "enable_min_number_of_numbers": false,
    "enable_min_number_of_special_characters": false,
    "password_max_length_value": 24,
    "password_min_length_value": 1,
    "min_number_of_upper_value": 1,
    "min_number_of_lower_value": 0,
    "min_num_of_numbers_value": 1,
    "min_number_of_special_characters_value": 1
},

And if some flags are "True" I need to create Regex dynamically.

for example:

enable_min_number_of_numbers= true
enable_min_number_of_upper = true
min_num_of_numbers_value= 3
min_number_of_upper_value = 2

Regex string will be

^(?=.*[A-Z]).{"min_number_of_upper_value",}(?=.*\d).{"min_num_of_numbers_value",}$

but it does not work for me.

What I need: Help me please to create Regex where I can disable or enable some parts of Regex and where I can set counts from my json.

Thank you.


Solution

  • Given your min_number_of_upper_value contains the min threshold of upper ASCII letters allowed in the string and min_num_of_numbers_value defines the min amount of digits in the string, you can use

    var pattern = $@"^(?=(?:[^A-Z]*[A-Z]){{{min_number_of_upper_value}}})(?=(?:\D*\d){{{min_num_of_numbers_value}}})";
    

    Do not use $, this anchor requires the end of string. If your code requires a full string match, then use

    var pattern = $@"^(?=(?:[^A-Z]*[A-Z]){{{min_number_of_upper_value}}})(?=(?:\D*\d){{{min_num_of_numbers_value}}}).*";
    

    where you may further adjust the consuming (.*) pattern in case your requirements are more specific.