Matching special characters and letters in regex
Asked Answered
C

7

65

I am trying to validate a string, that should contain letters numbers and special characters &-._ only. For that I tried with a regular expression.

var pattern = /[a-zA-Z0-9&_\.-]/
var qry = 'abc&*';
if(qry.match(pattern)) {
    alert('valid');
}
else{
    alert('invalid');
}

While using the above code, the string abc&* is valid. But my requirement is to show this invalid. ie Whenever a character other than a letter, a number or special characters &-._ comes, the string should evaluate as invalid. How can I do that with a regex?

Coan answered 19/12, 2012 at 6:23 Comment(1)
The key is to use ^ at the beginning and +$ at the end, as the answers below have explained. /^[a-zA-Z0-9&_\.-]+$/. I'm pointing this out in case you missed that subtle difference.Stifling
G
97

Add them to the allowed characters, but you'll need to escape some of them, such as -]/\

var pattern = /^[a-zA-Z0-9!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]*$/

That way you can remove any individual character you want to disallow.

Also, you want to include the start and end of string placemarkers ^ and $

Update:

As elclanrs understood (and the rest of us didn't, initially), the only special characters needing to be allowed in the pattern are &-._

pattern = /^[\w&.\-]+$/

[\w] is the same as [a-zA-Z0-9_]

Though the dash doesn't need escaping when it's at the start or end of the list, I prefer to do it in case other characters are added. Additionally, the + means you need at least one of the listed characters. If zero is ok (ie an empty value), then replace it with a * instead:

pattern = /^[\w&.\-]*$/
Gimbals answered 19/12, 2012 at 6:27 Comment(6)
I would suggest that any list which allows all those special characters should allow spaces as well.Cachinnate
Plus (+) character doesn't work with this expressionAthiste
@calbertts, do you mean where it's included in the list of characters in "var pattern..."? Which language are you using? Javascript?Gimbals
@HighlyIrregular I've tried to match a string with a plus (+) with Javascript, but I've found it's not that easy, actually, I just gave up with this and made a separated validation.Athiste
@calbertts, when the + character is not in square brackets, it needs to be escaped or it gets treated as a wildcard character. As a wildcard, it means: match 1 or more of the previous character/group-of-characters (depending on if they are wrapped in round or square brackets etc). eg In the pattern /^[\w&.\-]+$/, the + character is being used as a wildcard.Gimbals
With spaces: ^[a-zA-Z0-9!@#$%^&*()_+\-=[]{};':"\\|,.<>\/?\s]*$Coloration
G
20

Well, why not just add them to your existing character class?

var pattern = /[a-zA-Z0-9&._-]/

If you need to check whether a string consists of nothing but those characters you have to anchor the expression as well:

var pattern = /^[a-zA-Z0-9&._-]+$/

The added ^ and $ match the beginning and end of the string respectively.

Testing for letters, numbers or underscore can be done with \w which shortens your expression:

var pattern = /^[\w&.-]+$/

As mentioned in the comment from Nathan, if you're not using the results from .match() (it returns an array with what has been matched), it's better to use RegExp.test() which returns a simple boolean:

if (pattern.test(qry)) {
    // qry is non-empty and only contains letters, numbers or special characters.
}

Update 2

In case I have misread the question, the below will check if all three separate conditions are met.

if (/[a-zA-Z]/.test(qry) && /[0-9]/.test(qry) && /[&._-]/.test(qry)) {
   // qry contains at least one letter, one number and one special character
}
Gobbler answered 19/12, 2012 at 6:25 Comment(2)
+1. It might be worth mentioning to use test instead of match, since you don't really need the matches to be found. This could help performance, readability, and might help the asker learn something new.Stifling
Also, no slash after the i. /[a-z]/i/ should be /[a-z]/i.Stifling
C
16

Try this regex:

/^[\w&.-]+$/

Also you can use test.

if ( pattern.test( qry ) ) {
  // valid
}
Cartoon answered 19/12, 2012 at 6:33 Comment(0)
C
2
let pattern = /^(?=.*[0-9])(?=.*[!@#$%^&*])(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9!@#$%^&*]{6,16}$/;

//following will give you the result as true(if the password contains Capital, small letter, number and special character) or false based on the string format

let reee =pattern .test("helLo123@");   //true as it contains all the above
Cutcherry answered 16/1, 2019 at 11:5 Comment(1)
could you please a) format you code as code and b) add some explanation?Malacostracan
F
0

Try this RegEx: Matching special charecters which we use in paragraphs and alphabets

   Javascript : /^[a-zA-Z]+(([\'\,\.\-_ \/)(:][a-zA-Z_ ])?[a-zA-Z_ .]*)*$/.test(str)

                .test(str) returns boolean value if matched true and not matched false

            c# :  ^[a-zA-Z]+(([\'\,\.\-_ \/)(:][a-zA-Z_ ])?[a-zA-Z_ .]*)*$
Frankfrankalmoign answered 8/2, 2017 at 4:11 Comment(0)
F
0

I tried a bunch of these but none of them worked for all of my tests. So I found this:

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9])(?!.*\s).{8,15}$

from this source: https://www.w3resource.com/javascript/form/password-validation.php

Fetish answered 4/10, 2020 at 9:48 Comment(0)
B
0

Here you can match with special char:

function containsSpecialChars(str) {
  const specialChars = /[`!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?~]/;
  return specialChars.test(str);
}

console.log(containsSpecialChars('hello!')); // 👉️ true
console.log(containsSpecialChars('abc')); // 👉️ false
console.log(containsSpecialChars('one two')); // 👉️ false
Bank answered 16/2, 2023 at 8:20 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.