web-dev-qa-db-fra.com

Vérifier si une chaîne contient un caractère spécial

Comment vérifier si une chaîne contient un caractère spécial tel que:

[,],{,},{,),*,|,:,>,
63
blue
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");
113
r3zn1k

Vous pouvez utiliser le code suivant pour détecter le caractère spécial d'une chaîne.

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 == true)
        System.out.println("There is a special character in my string ");
     else
         System.out.println("There is no special char.");
     return 0;
 }
}
21
Ashish Sharma

Si cela correspond à l'expression rationnelle [a-zA-Z0-9 ]* alors il ne contient pas de caractères spéciaux.

14
fastcodejava

Qu'est-ce que vous appelez exactement "caractère spécial"? Si vous voulez dire quelque chose comme "tout ce qui n'est pas alphanumérique", vous pouvez utiliser la classe org.Apache.commons.lang.StringUtils (méthodes IsAlpha/IsNumeric/IsWhitespace/IsAsciiPrintable).

Si ce n'est pas si simple, vous pouvez utiliser une expression régulière qui définit la liste de caractères exacte que vous acceptez et associez la chaîne à celle-ci.

9
Michael Zilbermann

Si vous voulez avoir des lettres, caractères spéciaux et chiffres dans votre mot de passe avec au moins 8 chiffres, utilisez ce code, il fonctionne parfaitement

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;

}
9
Pir Fahim Shah

Tout dépend de ce que vous entendez par "spécial". Dans une regex, vous pouvez spécifier

  • \ W signifie non alpahnumérique
  • \ p {ponctuel} signifiera des caractères de ponctuation

Je soupçonne que ce dernier est ce que vous voulez dire. Mais sinon, utilisez une liste [] pour spécifier exactement ce que vous voulez.

7
djna

Regardez la classe Java.lang.Character. Il comporte quelques méthodes de test et vous en trouverez peut-être une qui correspond à vos besoins.

Exemples: Character.isSpaceChar(c) ou !Character.isJavaLetter(c)

7
Andreas_D

Vous devez d’abord identifier de manière exhaustive les caractères spéciaux que vous souhaitez vérifier.

Ensuite, vous pouvez écrire une expression régulière et utiliser

public boolean matches(String regex)
3
Varun
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.");
1
Bhushan

Cela a fonctionné pour moi:

String s = "string";
if (Pattern.matches("[a-zA-Z]+", s)) {
 System.out.println("clear");
} else {
 System.out.println("buzz");
}
1
antroid

Visitez chaque caractère de la chaîne pour voir s'il figure dans une liste noire de caractères spéciaux. c'est O (n * m).

Le pseudo-code est:

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

La complexité peut être légèrement améliorée en triant la liste noire afin que vous puissiez quitter chaque contrôle plus tôt. Cependant, la fonction de recherche de chaîne étant probablement du code natif, cette optimisation - qui serait dans Java byte-code] - pourrait bien être plus lente.

1
Will

// sans utiliser l'expression régulière ........

    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");
    }
1
saroj routray

// ceci est une version mise à jour du code que j'ai posté/* La méthode isValidName vérifiera si le nom transmis en argument ne doit pas contenir - 1.null value ou space 2.des caractères spéciaux 3.Digits (0-9) Explication-- - Ici, str2 est une variable de tableau String qui stocke la chaîne de nom fractionnée transmise en tant qu'argument. La variable count comptera le nombre de caractères spéciaux générés. La méthode retournera true si elle satisfait à toutes les conditions * /

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;
    }
}
1
saroj routray

dans la ligne String str2 [] = name.split (""); donnez un caractère supplémentaire dans Array ... Laissez-moi vous expliquer par l'exemple "Aditya" .split ("") renverrait [ A, d, i, t, y, a] Vous aurez un caractère supplémentaire dans votre Array .. .
Le "Aditya" .split ("") ne fonctionne pas comme prévu par saroj routray, vous obtiendrez un caractère supplémentaire dans String => [ A, d, i, t, y, a].

Je l'ai modifié, voir ci-dessous le code cela fonctionne comme prévu

 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;
    }
}
1
user4423251

Convertissez la chaîne en tableau de caractères avec toutes les lettres en minuscule:

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

Ensuite, vous pouvez utiliser Character.isLetterOrDigit(c[index]) pour déterminer quel index comporte des caractères spéciaux.

0
Raj