【问题标题】:RegExp.test not giving correct resultRegExp.test 没有给出正确的结果
【发布时间】:2018-11-12 06:14:50
【问题描述】:

在下面的代码中,我传递了一个包含密码的FormControl。我希望当密码为aA1[11] 时,RegExp.test 方法应该返回 false,但它返回 true!为什么我的代码返回 null 而不是错误对象 { validatePassword: { valid: false, message: 'password must contain 1 small-case letter [a-z], 1 capital letter [A-Z], 1 digit[0-9], 1 special character and the length should be between 6-10 characters' }

这个前向查找不应该匹配(?=.*[!@#$%^&*()_+}{":'?&gt.<,])

  validatePassword(control: FormControl) {

    let password: string = control.value;
 /*    So the rule for password is
     6-10 length
     contains a digit
     contains a lower case alphabet
     contains an upper case alphabet
     contains one more special character from the list !@#$%^&*()_+}{":;'?/>.<,
     does not contain space
     */
    let REG_EXP = new RegExp('(?=^.{6,10}$)(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+}{":\'?&gt.<,])(?!.*\\s).*$');
    /*RegExp's test method returns true if it finds a match, otherwise it returns false*/
    console.log('password: ',password);
    console.log('test result ',(REG_EXP.test(password)));
    return (REG_EXP.test(password)) ? null : {
      validatePassword: { //check the class ShowErrorsComponent to see how validatePassword is used.
        valid: false,
        message: 'password must contain 1 small-case letter [a-z], 1 capital letter [A-Z], 1 digit[0-9], 1 special character and the length should be between 6-10 characters'
      }
    }
  }

我从我的 Karma 测试用例中调用上述函数

fit('A password of length between 6-10 characters and containing at least 1 digit, at least  1 lowercase letter,  at least 1 upper case ' +
    'letter and but NOT at least 1 special character from the list !@#$%^&*()_+}{":;\'?/>.<, shall NOT be accepted',
    inject([HttpClient,HttpTestingController],(httpClient:HttpClient)=>{
      let helper = new HelperService(loaderService,httpClient);
      let passwordField = new FormControl();
      let password = 'aA1[11]';
      passwordField.setValue(password);
      let result = helper.validatePassword(passwordField);
      expect(result).toEqual(expectedErrorResponse);
    }));

我在控制台看到的输出是

password:  aA1[11]
test result  true

【问题讨论】:

    标签: regex angular6 karma-jasmine


    【解决方案1】:

    您可以使用以下代码来验证密码-

    validatePassword(control: FormControl) {
        let password: string = control.value;
    
        let REG_EXP = /^(?=.*\d)(?=.*[#$@!%&*?])[A-Za-z\d#$@!%&*?]{6,10}$/i; // modify as per your requirement, currently it accept atleast 1 character,1 special character,1 [0-9] number, length between 6 to 10.
    
        if(!REG_EXP.test(password)) { 
        return {  'validatePassword': { //check the class ShowErrorsComponent to see how validatePassword is used.
            'valid': false,
            'message': 'password must contain 1 small-case letter [a-z], 1 capital letter [A-Z], 1 digit[0-9], 1 special character and the length should be between 6-10 characters'
          } 
        }
        }
      }
    

    【讨论】:

    • @ManuChadha 可能是您的正则表达式不正确。您可以在 regextester.com 上测试您的正则表达式
    • @Shailendra:你的答案的正则表达式有问题,它没有单独检查一个小写和一个大写字符的存在,因为它匹配 a1@aaa 不应该这样密码不包含任何大写字母。由于它只检查数字和特殊字符,它甚至允许 1@@@@@@ 作为有效密码。您可能想要修复您的正则表达式。
    • @ManuChadha,您可以根据需要更新自己的正则表达式。
    【解决方案2】:

    问题出在正则表达式上。我将&amp 更改为&,将&quot 更改为",将&gt 更改为>,将&lt 更改为<。似乎在我的代码(角度)中,& 之后的字母被逐字处理。所以aA1[11] 中的a&amp 中的a 匹配

    【讨论】:

      猜你喜欢
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-01
      • 2015-11-12
      • 2012-08-30
      • 2016-04-15
      相关资源
      最近更新 更多