97

How do you check if a String contains a special character like:

[,],{,},{,),*,|,:,>,
Paolo Forgia
  • 6,572
  • 8
  • 46
  • 58
blue
  • 971
  • 1
  • 7
  • 3

19 Answers19

148
Pattern p = Pattern.compile("[^a-z0-9 ]", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("I am a string");
boolean b = m.find();

if (b)
   System.out.println("There is a special character in my string");
ruakh
  • 175,680
  • 26
  • 273
  • 307
oliver31
  • 2,523
  • 3
  • 19
  • 25
  • 4
    you need to import the correct Matcher and Pattern. import java.util.regex.Matcher; import java.util.regex.Pattern; This code is great for telling of the string passed in contains only a-z and 0-9, it won't give you a location of the 'bad' character or what it is, but then the question didn't ask for that. I feel regex is great skill for a programmer to master, I'm still trying. – jeff porter Nov 25 '09 at 09:13
  • 3
    if you want to show the the bad character you can use m.group() or m.group(index) – AITAALI_ABDERRAHMANE May 03 '13 at 10:14
  • 2
    This will allow you Alpha numeric validation. If you update Reg Ex little bit Like => [^a-z] than it will validate alpha characters only. – Krishna Kumar Chourasiya Sep 19 '16 at 04:48
29

If you want to have LETTERS, SPECIAL CHARACTERS and NUMBERS in your password with at least 8 digit, then use this code, it is working perfectly

public static boolean Password_Validation(String password) 
{

    if(password.length()>=8)
    {
        Pattern letter = Pattern.compile("[a-zA-z]");
        Pattern digit = Pattern.compile("[0-9]");
        Pattern special = Pattern.compile ("[!@#$%&*()_+=|<>?{}\\[\\]~-]");
        //Pattern eight = Pattern.compile (".{8}");


           Matcher hasLetter = letter.matcher(password);
           Matcher hasDigit = digit.matcher(password);
           Matcher hasSpecial = special.matcher(password);

           return hasLetter.find() && hasDigit.find() && hasSpecial.find();

    }
    else
        return false;

}
Pir Fahim Shah
  • 10,505
  • 1
  • 82
  • 81
28

You can use the following code to detect special character from string.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DetectSpecial{ 
public int getSpecialCharacterCount(String s) {
     if (s == null || s.trim().isEmpty()) {
         System.out.println("Incorrect format of string");
         return 0;
     }
     Pattern p = Pattern.compile("[^A-Za-z0-9]");
     Matcher m = p.matcher(s);
    // boolean b = m.matches();
     boolean b = m.find();
     if (b)
        System.out.println("There is a special character in my string ");
     else
         System.out.println("There is no special char.");
     return 0;
 }
}
Evargalo
  • 126
  • 6
Ashish Sharma
  • 337
  • 3
  • 4
15

If it matches regex [a-zA-Z0-9 ]* then there is not special characters in it.

fastcodejava
  • 39,895
  • 28
  • 133
  • 186
10

What do you exactly call "special character"? If you mean something like "anything that is not alphanumeric" you can use org.apache.commons.lang.StringUtils class (methods IsAlpha/IsNumeric/IsWhitespace/IsAsciiPrintable).

If it is not so trivial, you can use a regex that defines the exact character list you accept and match the string against it.

Benjamin Buch
  • 4,752
  • 7
  • 28
  • 51
Michael Zilbermann
  • 1,398
  • 9
  • 19
8

This is tested in android 7.0 up to android 10.0 and it works

Use this code to check if string contains special character and numbers:

  name = firstname.getText().toString(); //name is the variable that holds the string value

  Pattern special= Pattern.compile("[^a-z0-9 ]", Pattern.CASE_INSENSITIVE);
  Pattern number = Pattern.compile("[0-9]", Pattern.CASE_INSENSITIVE);
  Matcher matcher = special.matcher(name);
  Matcher matcherNumber = number.matcher(name);
  
  boolean constainsSymbols = matcher.find();
  boolean containsNumber = matcherNumber.find();

  if(constainsSymbols){
   //string contains special symbol/character
  }
  else if(containsNumber){
   //string contains numbers
  }
  else{
   //string doesn't contain special characters or numbers
  }
Atul Panda
  • 357
  • 5
  • 20
Jeanne vie
  • 518
  • 6
  • 12
7

All depends on exactly what you mean by "special". In a regex you can specify

  • \W to mean non-alpahnumeric
  • \p{Punct} to mean punctuation characters

I suspect that the latter is what you mean. But if not use a [] list to specify exactly what you want.

djna
  • 54,992
  • 14
  • 74
  • 117
7

Have a look at the java.lang.Character class. It has some test methods and you may find one that fits your needs.

Examples: Character.isSpaceChar(c) or !Character.isJavaLetter(c)

Andreas Dolk
  • 113,398
  • 19
  • 180
  • 268
4

This worked for me:

String s = "string";
if (Pattern.matches("[a-zA-Z]+", s)) {
 System.out.println("clear");
} else {
 System.out.println("buzz");
}
Paolo Forgia
  • 6,572
  • 8
  • 46
  • 58
Antroid
  • 391
  • 4
  • 15
3

First you have to exhaustively identify the special characters that you want to check.

Then you can write a regular expression and use

public boolean matches(String regex)
Varun
  • 1,014
  • 8
  • 23
3

//without using regular expression........

    String specialCharacters=" !#$%&'()*+,-./:;<=>?@[]^_`{|}~0123456789";
    String name="3_ saroj@";
    String str2[]=name.split("");

    for (int i=0;i<str2.length;i++)
    {
    if (specialCharacters.contains(str2[i]))
    {
        System.out.println("true");
        //break;
    }
    else
        System.out.println("false");
    }
2

//this is updated version of code that i posted /* The isValidName Method will check whether the name passed as argument should not contain- 1.null value or space 2.any special character 3.Digits (0-9) Explanation--- Here str2 is String array variable which stores the the splited string of name that is passed as argument The count variable will count the number of special character occurs The method will return true if it satisfy all the condition */

public boolean isValidName(String name)
{
    String specialCharacters=" !#$%&'()*+,-./:;<=>?@[]^_`{|}~0123456789";
    String str2[]=name.split("");
    int count=0;
    for (int i=0;i<str2.length;i++)
    {
        if (specialCharacters.contains(str2[i]))
        {
            count++;
        }
    }       

    if (name!=null && count==0 )
    {
        return true;
    }
    else
    {
        return false;
    }
}
Maksim Simkin
  • 9,561
  • 4
  • 36
  • 49
2
Pattern p = Pattern.compile("[\\p{Alpha}]*[\\p{Punct}][\\p{Alpha}]*");
        Matcher m = p.matcher("Afsff%esfsf098");
        boolean b = m.matches();

        if (b == true)
           System.out.println("There is a sp. character in my string");
        else
            System.out.println("There is no sp. char.");
Bhushan
  • 18,329
  • 31
  • 104
  • 137
1

Visit each character in the string to see if that character is in a blacklist of special characters; this is O(n*m).

The pseudo-code is:

for each char in string:
  if char in blacklist:
    ...

The complexity can be slightly improved by sorting the blacklist so that you can early-exit each check. However, the string find function is probably native code, so this optimisation - which would be in Java byte-code - could well be slower.

Will
  • 73,905
  • 40
  • 169
  • 246
1

in the line String str2[]=name.split(""); give an extra character in Array... Let me explain by example "Aditya".split("") would return [, A, d,i,t,y,a] You will have a extra character in your Array...
The "Aditya".split("") does not work as expected by saroj routray you will get an extra character in String => [, A, d,i,t,y,a].

I have modified it,see below code it work as expected

 public static boolean isValidName(String inputString) {

    String specialCharacters = " !#$%&'()*+,-./:;<=>?@[]^_`{|}~0123456789";
    String[] strlCharactersArray = new String[inputString.length()];
    for (int i = 0; i < inputString.length(); i++) {
         strlCharactersArray[i] = Character
            .toString(inputString.charAt(i));
    }
    //now  strlCharactersArray[i]=[A, d, i, t, y, a]
    int count = 0;
    for (int i = 0; i <  strlCharactersArray.length; i++) {
        if (specialCharacters.contains( strlCharactersArray[i])) {
            count++;
        }

    }

    if (inputString != null && count == 0) {
        return true;
    } else {
        return false;
    }
}
0

Convert the string into char array with all the letters in lower case:

char c[] = str.toLowerCase().toCharArray();

Then you can use Character.isLetterOrDigit(c[index]) to find out which index has special characters.

Paolo Forgia
  • 6,572
  • 8
  • 46
  • 58
Raj
  • 1
0

There are a few approaches you can take to determine if a string contains a set of specified characters.

You can use a regular expression pattern, specifically a character-class.

"example*".matches(".*?[" + Pattern.quote("[]{}{)*|:>") + "].*");

Or, you can create a for-loop, which returns true if it finds a match.

boolean contains(String string, char... characters) {
    for (char characterA : string.toCharArray()) {
        for (char characterB : characters) {
            if (characterA == characterB)
                return true;
        }
    }
    return false;
}
Reilas
  • 3,297
  • 2
  • 4
  • 17
0

Using .replaceAll() and comparing if the resulting string is the same as the original could be a possible method as well.

For example:

specialCharRegex = "[,=':;><?/~`_.!@#^&*]|\\[|\\]";

if(str.equals(str.replaceAll(specialCharRegex, "")){
    System.out.println(str + " does not contain special characters")
}
else{
    System.out.println(str + " contains special characters"
}
JoReyner
  • 13
  • 3
-1

Use java.util.regex.Pattern class's static method matches(regex, String obj)
regex : characters in lower and upper case & digits between 0-9
String obj : String object you want to check either it contain special character or not.

It returns boolean value true if only contain characters and numbers, otherwise returns boolean value false

Example.

String isin = "12GBIU34RT12";<br>
if(Pattern.matches("[a-zA-Z0-9]+", isin)<br>{<br>
   &nbsp; &nbsp; &nbsp; &nbsp;System.out.println("Valid isin");<br>
}else{<br>
   &nbsp; &nbsp; &nbsp; &nbsp;System.out.println("Invalid isin");<br>
}
Farhana Naaz Ansari
  • 7,524
  • 26
  • 65
  • 105