goldwind1111
goldwind1111

Reputation: 51

Order of Operations in Regular Expressions (solving a challenge)

I am working on a problem from FreeCodeCamp that involves me developing a Regular Expression that meets these four requirements:

What I have decided on is /[a-z]/ig, which covers all of the test cases except for the following three:

What confuses me is that if I add numbers (\d) into my Regex then some of my simpler requirements ("Regex should match JACK") are now incorrect.

I was thinking that I could do something like:

/[a-b+?]*\d/

or this

/[a-b^0-9$]/

But that throws off things.

Can someone lend me a hand and explain how this might work?

Upvotes: 2

Views: 482

Answers (1)

The fourth bird
The fourth bird

Reputation: 163362

The patterns that you tried do not match because:

  • The pattern [a-b+?]*\d matches optional chars a b + or ? followed by a single digit, which makes the digit mandatory and matches not allowed chars

  • The pattern [a-b^0-9$] only matches a single char a b ^ digit 0-9 or $ and also matches not allowed chars


You could either match 2 or more chars a-z followed by optional digits, or match a single char a-z followed by 2 or more digits.

^[a-z](?:[a-z]+\d*|\d{2,})$

Explanation

  • ^ Start of string
  • [a-z] Always start with a char a-z
  • (?: Non capture group
    • [a-z]+\d* Match 1 or more chars a-z and optional digits
    • | Or
    • \d{2,} Match 2 or more digits
  • ) Close non capture group
  • $ End of string

Regex demo

const regex = /^[a-z](?:[a-z]+\d*|\d{2,})$/i;
[
  "aa",
  "JACK",
  "abc",
  "ab1",
  "Z97",
  "BadUs3rnam3",
  "c57bT3",
  "a",
  "0",
  "01",
  "a1",
  "a",
  "ab1a"
].forEach(s => console.log(`${s} --> ${regex.test(s)}`));

Upvotes: 2

Related Questions