Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular pattern validation with regex

I need to make a password pattern validator

the password should have:

  • 1 uppercase letter
  • 1 lowercase letter
  • A number
  • A minimum length of 8.

I found this regex pattern:

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

however, the validator always claims my input is invalid

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

according to https://regex101.com/r/AfAdKp/1 this value is supposed to be valid.

Edit: to clarify, Test1234 is supposed to work

like image 654
Nicolas Avatar asked Jun 26 '18 15:06

Nicolas


2 Answers

You have multiple issues with your current regex:

  1. Your regex doesn't have a quantifier for character class
  2. Validators.pattern doesn't need delimiters but you threw one at beginning
  3. You should double escape tokens.

What you need is this:

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

See live demo here

like image 191
revo Avatar answered Sep 25 '22 03:09

revo


You have to add the quantifier [A-Za-z\d!$%@#£€*?&]{8,} to repeat the character class a minimum of 8 times and separate the assertions for an uppercase and lowercase character:

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

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

  • ^ Assert position at the start of the string
  • (?=.*[A-Z]) Positive lookahead to assert that what follows is an uppercase character
  • (?=.*[a-z]) Positive lookahead to assert that what follows is an lowercase character
  • (?=.*\d) Positive lookahead to assert that what follows is a digit
  • [A-Za-z\d!$%@#£€*?&]{8,} Match any of the charachters in the character class 8 or more times
  • $ Assert position at the end of the line

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));
});
like image 36
The fourth bird Avatar answered Sep 24 '22 03:09

The fourth bird