【问题标题】:Angular pattern validation with regex使用正则表达式进行角度模式验证
【发布时间】:2018-06-26 15:03:28
【问题描述】:

我需要做一个密码模式验证器

密码应该有:

  • 1 个大写字母
  • 1 个小写字母
  • 一个数字
  • 最小长度为 8。

我发现了这个正则表达式模式:

Validators.pattern('/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d!$%@#£€*?&]')

但是,验证器总是声称我的输入无效

errors:    
   pattern:
      actualValue: "Test1234"
      requiredPattern: "^/^(?=.*[A-Za-z])(?=.*d)[A-Za-zd!$%@#£€*?&]$"

根据https://regex101.com/r/AfAdKp/1,这个值应该是有效的。

编辑:澄清一下,Test1234 应该可以工作

【问题讨论】:

    标签: regex angular typescript


    【解决方案1】:

    您当前的正则表达式存在多个问题:

    1. 您的正则表达式没有字符类的量词
    2. Validators.pattern 不需要分隔符,但你一开始就扔了一个
    3. 您应该使用双重转义标记。

    你需要的是这个:

    Validators.pattern('^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\\D*\\d)[A-Za-z\\d!$%@#£€*?&]{8,}$');
    

    live demo here

    【讨论】:

      【解决方案2】:

      您必须添加量词 [A-Za-z\d!$%@#£€*?&]{8,} 以重复字符类至少 8 次,并将大写和小写字符的断言分开:

      Validators.pattern('^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d)[A-Za-z\\d!$%@#£€*?&]{8,}$')
      

      ^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)[A-Za-z\d!$%@#£€*?&]{8,}$

      • ^ 在字符串的开头断言位置
      • (?=.*[A-Z]) 正向前瞻断言后面是大写字符
      • (?=.*[a-z]) 正向前瞻断言后面是小写字符
      • (?=.*\d) 肯定的前瞻断言后面是一个数字
      • [A-Za-z\d!$%@#£€*?&]{8,} 匹配字符类中的任意字符 8 次或更多次
      • $ 在行尾断言位置

      const strings = [
        "A88888jf",
        "Aa88888jf",
        "Aa888jf",
        "AAAAAAAAAAA",
        "aaaaaaaaaaaaaa",
        "2222222222222222",
        "1sAdfe44",
        "$#fd#######"
      ];
      let pattern = /^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)[A-Za-z\d!$%@#£€*?&]{8,}$/;
      
      strings.forEach((s) => {
        console.log(s + " ==> " + pattern.test(s));
      });

      【讨论】:

      • 这不起作用pattern:{requiredPattern: "^(?=.*[A-Z])(?=.*[a-z])(?=.*d)[A-Za-zd!$%@#£€*?&]{8,}$", actualValue: "Test1234"}
      • 为什么Test1234 不匹配?
      • 这就是问题所在,它应该匹配,但它给了我错误,因为它不匹配。
      • @Nicolas 您可以将错误添加到您的问题中吗?您是否尝试过不使用正斜杠?
      猜你喜欢
      • 2020-02-18
      • 2017-02-28
      • 2014-12-25
      • 2014-04-21
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多