12

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

2 Answers 2

23

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

Sign up to request clarification or add additional context in comments.

Comments

3

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));
});

4 Comments

This doesn't work pattern:{requiredPattern: "^(?=.*[A-Z])(?=.*[a-z])(?=.*d)[A-Za-zd!$%@#£€*?&]{8,}$", actualValue: "Test1234"}
Why should Test1234 not match?
That's the problem, it's supposed to match, but it gives me the error cause it doesn't.
@Nicolas Can you add the error to your question? Did you try it without the forward slash?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.