Gerald
Gerald

Reputation: 1083

Regex not allowing certain special characters

I have the following regex which does not allow certain special characters:

if (testString.match(/[`~,.<>;':"\/\[\]\|{}()-=_+]/)){    
    alert("password not valid");
}
else
{
    alert("password valid");
}

This is working. This regex will accept a password if it does not contain any of the special characters inside the bracket (~,.<>;':"\/\[\]\|{}()-=_+).

My problem here is it also don't allow me to input numbers which is weird.

Anything I missed here? Thanks in advance!

Here is a sample:

jsFiddle

Upvotes: 9

Views: 62154

Answers (1)

Martin Ender
Martin Ender

Reputation: 44259

You've got a character range in there: )-= which includes all ASCII characters between ) and = (including numbers). Move the - to the end of the class or escape it:

/[`~,.<>;':"\/\[\]\|{}()=_+-]/

Also, you don't need to escape all of those characters:

/[`~,.<>;':"/[\]|{}()=_+-]/

Note that in your case, it is probably enough for you, to use test instead of match:

if (/[`~,.<>;':"/[\]|{}()=_+-]/.test(testString))){
    ...

test returns a boolean (which is all you need), while match returns an array with all capturing groups (which you are discarding anyway).

Note that, as Daren Thomas points out in a comment, you should rather decide which characters you want to allow. Because the current approach doesn't take care of all sorts of weird Unicode characters, while complaining about some fairly standard ones like _. To create a whitelist, you can simply invert both the character class and the condition:

if (!/[^a-zA-Z0-9]/.test(testString)) {
   ...

And include all the characters you do want to allow.

Upvotes: 11

Related Questions