Regex to Match Symbols: !$%^&*()_+|~-=`{}[]:";'<>?,./
Matthew Harrington
I'm trying to create a Regex test in JavaScript that will test a string to contain any of these characters:
!$%^&*()_+|~-=`{}[]:";'<>?,./More Info If You're Interested :)
It's for a pretty cool password change application I'm working on. In case you're interested here's the rest of the code.
I have a table that lists password requirements and as end-users types the new password, it will test an array of Regexes and place a checkmark in the corresponding table row if it... checks out :) I just need to add this one in place of the 4th item in the validation array.
var validate = function(password){ valid = true; var validation = [ RegExp(/[a-z]/).test(password), RegExp(/[A-Z]/).test(password), RegExp(/\d/).test(password), RegExp(/\W|_/).test(password), !RegExp(/\s/).test(password), !RegExp("12345678").test(password), !RegExp($('#txtUsername').val()).test(password), !RegExp("cisco").test(password), !RegExp(/([a-z]|[0-9])\1\1\1/).test(password), (password.length > 7) ] $.each(validation, function(i){ if(this) $('.form table tr').eq(i+1).attr('class', 'check'); else{ $('.form table tr').eq(i+1).attr('class', ''); valid = false } }); return(valid);
}Yes, there's also corresponding server-side validation!
47 Answers
The regular expression for this is really simple. Just use a character class. The hyphen is a special character in character classes, so it needs to be first:
/[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]/You also need to escape the other regular expression metacharacters.
Edit:The hyphen is special because it can be used to represent a range of characters. This same character class can be simplified with ranges to this:
/[$-/:-?{-~!"^_`\[\]]/There are three ranges. '$' to '/', ':' to '?', and '{' to '~'. the last string of characters can't be represented more simply with a range: !"^_`[].
Use an ACSII table to find ranges for character classes.
10The most simple and shortest way to accomplish this:
/[^\p{L}\d\s@#]/uExplanation
[^...] Match a single character not present in the list below
\p{L}=> matches any kind of letter from any language\d=> matches a digit zero through nine\s=> matches any kind of invisible character@#=>@and#characters
Don't forget to pass the u (unicode) flag.
Answer
/[\W\S_]/Explanation
This creates a character class removing the word characters, space characters, and adding back the underscore character (as underscore is a "word" character). All that is left is the special characters. Capital letters represent the negation of their lowercase counterparts.
\W will select all non "word" characters equivalent to [^a-zA-Z0-9_]\S will select all non "whitespace" characters equivalent to [ \t\n\r\f\v]_ will select "_" because we negate it when using the \W and need to add it back in
// The string must contain at least one special character, escaping reserved RegEx characters to avoid conflict const hasSpecial = password => { const specialReg = new RegExp( '^(?=.*[!@#$%^&*"\\[\\]\\{\\}<>/\\(\\)=\\\\\\-_´+`~\\:;,\\.€\\|])', ); return specialReg.test(password); }; 3 A simple way to achieve this is the negative set [^\w\s]. This essentially catches:
- Anything that is not an alphanumeric character (letters and numbers)
- Anything that is not a space, tab, or line break (collectively referred to as whitespace)
For some reason [\W\S] does not work the same way, it doesn't do any filtering. A comment by Zael on one of the answers provides something of an explanation.
1How about (?=\W_)(?=\S).? It checks that the character matched by the . is not a word character (however _ is allowed) and that it's not whitespace.
Note: as @Casimir et Hippolyte pointed out in another comment, this will also match characters like é and such. If you don't expect such characters then this is a working solution.
Replace all latters from any language in 'A', and if you wish for example all digits to 0:
return str.replace(/[^\s!-@[-`{-~]/g, "A").replace(/\d/g, "0"); 1