Home > Software design >  My custom Regex email validator is not working as intended
My custom Regex email validator is not working as intended

Time:02-12

I am trying to create a custom Regex to validate emails that follow the rules stated below:

  1. Email should start with a alphabet (a-z) and should not start with special characters or numeric values
  2. after the first letter, it could contains numbers(0-9), letters(a-z), underscores(_) and dot(.)
  3. it should have only one @ symbol in it
  4. after the @ symbol, it should only allow to contain alphabets and dot (no more special characters or numbers other than dot(.))
  5. email should not end with dot(.) but rather end with an alphabet
  6. it should not have any whitespace anywhere

I have two arrays: trueEmails contains valid emails and notEmails contains invalid emails.

I created the following Regex:

const email = /^[a-zA-Z] (\d|.|\w)*@[a-zA-Z] .[a-zA-Z] .*[a-zA-Z] $/;

My Regex is not working for rule no. 2, 3, 4 and 6. Here is my code.

const notEmails = [
    // rule 1
    '[email protected]',
    '#[email protected]',
    '[email protected]',
    // rule 2
    'test&[email protected]',
    // rule 3
    'test@[email protected]',
    // rule 4
    '[email protected]',
    // rule 5
    '[email protected].',
    // rule 6
    'white [email protected]'

]

const trueEmails = [
    // rule 1
    '[email protected]',
    // rule 2
    '[email protected]',
    '[email protected]',
    '[email protected]',
    // rule 3
    '[email protected]',
    // rule 4
    '[email protected]',
    // rule 5
    '[email protected]',
    // rule 6
    '[email protected]'
]

const email = /^[a-zA-Z] (\d|.|\w)*@[a-zA-Z] .[a-zA-Z] .*[a-zA-Z] $/;

console.log("NotEmails, should return false")
console.log(notEmails.map((each) => each   ' => '   email.test(each)));

console.log("trueEmails, should return true")
console.log(trueEmails.map((each) => each   ' => '    email.test(each)));

Thanks in advance.

CodePudding user response:

I've updated the regex to work for you. It's not fool proof but works for the restrictions you've put in place.

const notEmails = [
    // rule 1
    '[email protected]',
    '#[email protected]',
    '[email protected]',
    // rule 2
    'test&[email protected]',
    // rule 3
    'test@[email protected]',
    // rule 4
    '[email protected]',
    // rule 5
    '[email protected].',
    // rule 6
    'white [email protected]'

]

const trueEmails = [
    // rule 1
    '[email protected]',
    // rule 2
    '[email protected]',
    '[email protected]',
    '[email protected]',
    // rule 3
    '[email protected]',
    // rule 4
    '[email protected]',
    // rule 5
    '[email protected]',
    // rule 6
    '[email protected]'
]

const email = /^[a-zA-Z] [a-zA-Z0-9_.] @[a-zA-Z.] [a-zA-Z]$/;

console.log("NotEmails, should return false")
console.log(notEmails.map((each) => each   ' => '   email.test(each)));

console.log("trueEmails, should return true")
console.log(trueEmails.map((each) => each   ' => '    email.test(each)));

Description

Regex: /^[a-zA-Z] [a-zA-Z0-9_.] @[a-zA-Z.] [a-zA-Z]$/

  • ^ Start of line
  • [a-zA-Z] any character from a-z
  • one or more times
  • [a-zA-Z0-9_.] any character from a-z, and number, underscores and periods.
  • one or more times
  • @ matches literal @ sign
  • [a-zA-Z.] any character from a-z and periods
  • one or more times
  • [a-zA-Z]` any character from a-z
  • $ end of line

CodePudding user response:

I'd suggest a case-insensitive search.
And not allowing 2 connected dots.

/^(?!.*[.]{2})(?=[a-z])[\w.]*[a-z0-9]@[a-z][a-z.]*[.][a-z]{2,63}$/i

const notEmails = [
    // rule 1
    '[email protected]',
    '#[email protected]',
    '[email protected]',
    // rule 2
    'test&[email protected]',
    // rule 3
    'test@[email protected]',
    // rule 4
    '[email protected]',
    // rule 5
    '[email protected].',
    // rule 6
    'white [email protected]'

]

const trueEmails = [
    // rule 1
    '[email protected]',
    // rule 2
    '[email protected]',
    '[email protected]',
    '[email protected]',
    // rule 3
    '[email protected]',
    // rule 4
    '[email protected]',
    // rule 5
    '[email protected]',
    // rule 6
    '[email protected]'
]

const email = /^(?!.*[.]{2})(?=[a-z])[\w.]*[a-z0-9]@[a-z][a-z.]*[.][a-z]{2,63}$/i;

console.log("NotEmails, should return false")
console.log(notEmails.map((each) => each   ' => '   email.test(each)));

console.log("trueEmails, should return true")
console.log(trueEmails.map((each) => each   ' => '    email.test(each)));

  • Related