Skip to content
Advertisement

Hard Regex problems: conditionals search if it passes two or all three conditionals

so im having trouble writing regex in javascript. I want to practice using conditionals on regex.

Problem i want to solve:

  • combinations of (small/capital letters) + (numbers) + (special characters)
  • if using two of the possible combinations, the length should be from 10-16 long
  • if using three of the possible combinations, the length should be from 8-16 long

Regex for combinations:

^(?=.{10,16}$)(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[0-9])(?=.*?W).*$

Advertisement

Answer

Interesting problem! You can use an OR pattern: ^((...)|(...)) where you test separately for two or three combinations. Test case:

[
  '1234567890123456', // fail, only numbers
  'abcdefghijklmnop', // fail, only letters
  '12345a678',        // fail, 2 combinations, too short
  '12345a678b',       // pass, 2 combinations, 10 chars
  '12345a67890bcdef', // pass, 2 combinations, 16 chars
  '12345a67890bcdefg',// fail, 2 combinations, too long
  '12+34ab',          // fail, 3 combinations, too short
  '12+34abc',         // pass, 3 combinations, 8 chars
  '12+34567890ab$cd', // pass, 3 combinations, 19 chars
  '12+34567890ab$cde' // fail, 3 combinations, too long
].forEach(str => {
  const re = /^(((?=.{10,16}$)(?=.*?[a-zA-Z])(?=.*?[0-9]))|((?=.{10,16}$)(?=.*?[a-zA-Z])(?=.*?[W]))|((?=.{10,16}$)(?=.*?[0-9])(?=.*?[W]))|((?=.{8,16}$)(?=.*?[a-zA-Z])(?=.*?[0-9])(?=.*?[W])))/;
  console.log(str + (re.test(str) ? ' => pass' : ' => fail'));
});

Result:

1234567890123456 => fail
abcdefghijklmnop => fail
12345a678 => fail
12345a678b => pass
12345a67890bcdef => pass
12345a67890bcdefg => fail
12+34ab => fail
12+34abc => pass
12+34567890ab$cd => pass
12+34567890ab$cde => fail

Explanation of regex:

  • ^ — anchor at start of string
  • ((..A..)|(..B..)|(..C..)|(..D..)) — logical OR of parts …A… to …D…
  • part …A…:
    • (?=.{10,16}$) — positive lookahead for 10 to 16 chars, AND
    • (?=.*?[a-zA-Z]) — positive lookahead for an upper or lowercase letter, AND
    • (?=.*?[0-9]) — positive lookahead for a number
  • part …B…:
    • (?=.{10,16}$) — positive lookahead for 10 to 16 chars, AND
    • (?=.*?[a-zA-Z]) — positive lookahead for an upper or lowercase letter, AND
    • (?=.*?[W]) — positive lookahead for a special char
  • part …C…:
    • (?=.{10,16}$) — positive lookahead for 10 to 16 chars, AND
    • (?=.*?[0-9]) — positive lookahead for a number, AND
    • (?=.*?[W]) — positive lookahead for a special char
  • part …D…:
    • (?=.{8,16}$) — positive lookahead for 8 to 16 chars, AND
    • (?=.*?[a-zA-Z]) — positive lookahead for an upper or lowercase letter, AND
    • (?=.*?[0-9]) — positive lookahead for a number
    • (?=.*?[W]) — positive lookahead for a special char
User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement