【问题标题】: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 复制到任何为您生成类的工具中 stackoverflow.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}}})";
  • 为什么要在一个正则表达式中完成整个逻辑? “始终进行规划,以便您可以为继任者提供家庭住址”

标签: c# regex regex-lookarounds


【解决方案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}}}$)(允许换行)。
猜你喜欢
  • 2017-04-20
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 2013-05-06
  • 1970-01-01
  • 2016-01-13
  • 2018-07-15
  • 1970-01-01
相关资源
最近更新 更多