正则表达式:动态创建字符串

Posted

技术标签:

【中文标题】正则表达式:动态创建字符串【英文标题】:Regex: creating string dynamically 【发布时间】:2021-07-19 13:38:23 【问题描述】:

需要正则表达式来检查密码策略

我有一个模型:

"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
,

如果某些标志为“真”,我需要动态创建正则表达式。

例如:

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

正则表达式字符串将是

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

但它对我不起作用。

我需要什么: 请帮助我创建正则表达式,我可以在其中禁用或启用正则表达式的某些部分以及我可以从我的 json 设置计数的位置。

谢谢。

【问题讨论】:

这看起来像一个 JSON 字符串。最好使用 json 解析器。 将您的 json 复制到任何为您生成类的工具中 ***.com/questions/21611674/…。只需var my_object = JsonConvert.DeserializeObject<MyAutoGeneratedClass>(jsonText),瞧,您的对象中就会填充您的所有数据。 它将是var pattern = $@"^(?=(?:[^A-Z]*[A-Z])min_number_of_upper_value)(?=(?:\D*\d)min_num_of_numbers_value)"; 为什么要在一个正则表达式中完成整个逻辑? “始终进行规划,以便您可以为继任者提供家庭住址” 【参考方案1】:

鉴于您的 min_number_of_upper_value 包含字符串中允许的大写 ASCII 字母的最小阈值,并且min_num_of_numbers_value 定义了字符串中的最小位数,您可以使用

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

不要使用$,这个锚点需要字符串的结尾。如果您的代码需要完整的字符串匹配,请使用

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

如果您的要求更具体,您可以进一步调整消费 (.*) 模式。

【讨论】:

不起作用。我添加了 5 个上位后来者和 4 个数字 regex101.com/r/YaCkLT/1 @IgorStrekha 查看正确的测试:regex101.com/r/M2nSxf/1。在插值字符串文字中,单个文字 char 定义为双 字符也是如此。请参阅the C# snippet 正确生成^(?=(?:[^A-Z]*[A-Z])5)(?=(?:\D*\d)4).* 谢谢。但我能提供更多帮助吗? (?:[^az]*[az])5) - 这部分用于小写字母,(?=(?:[^AZ]*[AZ])5) - 用于大写字母,(?= (?:\D*\d)4) - 用于数字。特殊符号将是什么?最小长度和+最大长度是多少?谢谢维克托... @IgorStrrekha 见how to match special chars,如果没有详细的规格,我无法提供帮助。至于总最小、最大长度,只需在^ 之后使用(?=.min,max$)(?=(?s:.)min,max$)(允许换行)。

以上是关于正则表达式:动态创建字符串的主要内容,如果未能解决你的问题,请参考以下文章

在 case 语句中使用正则表达式提取动态内容

动态规划之正则表达式匹配字符串

动态网页制作PHP常用的正则表达式

仅匹配指定字符的最后一次出现的正则表达式

向自定义正则表达式添加动态错误消息

如何用正则表达式匹配指定字符开始和指定字符结束?