JAVA: controlla una stringa se è presente un carattere speciale

Come si controlla una stringa se c’è un carattere speciale come:

[,],{,},{,),*,|,:,>, 

 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"); 

È ansible utilizzare il seguente codice per rilevare caratteri speciali dalla stringa.

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

Se corrisponde a regex [a-zA-Z0-9 ]* non contiene caratteri speciali.

Che cosa chiami esattamente “personaggio speciale”? Se si intende qualcosa come “qualsiasi cosa che non sia alfanumerica”, è ansible utilizzare la class org.apache.commons.lang.StringUtils (metodi IsAlpha / IsNumeric / IsWhitespace / IsAsciiPrintable).

Se non è così banale, puoi usare una regex che definisce la lista dei caratteri esatta che accetti e abbina la stringa a essa.

Tutto dipende esattamente da cosa intendi per “speciale”. In un’espressione regolare è ansible specificare

  • \ W significa non alpahnumeric
  • \ p {Punct} per indicare i caratteri di punteggiatura

Sospetto che quest’ultimo sia ciò che intendi. Ma se non si utilizza un elenco [] per specificare esattamente ciò che si desidera.

Dai un’occhiata alla class java.lang.Character . Ha alcuni metodi di prova e potresti trovarne uno adatto alle tue esigenze.

Esempi: Character.isSpaceChar(c) o !Character.isJavaLetter(c)

Per prima cosa devi identificare in modo esaustivo i caratteri speciali che vuoi controllare.

Quindi puoi scrivere un’espressione regolare e usarla

 public boolean matches(String regex) 

Se vuoi avere LETTERE, CARATTERI SPECIALI e NUMERI nella tua password con almeno 8 cifre, usa questo codice, funziona perfettamente

 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 ("[[email protected]#$%&*()_+=|<>?{}\\[\\]~-]"); //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; } 

Visita ciascun carattere nella stringa per vedere se quel personaggio si trova in una lista nera di caratteri speciali; questo è O (n * m).

Lo pseudo-codice è:

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

La complessità può essere leggermente migliorata ordinando la lista nera in modo da poter uscire anticipatamente da ciascun controllo. Tuttavia, la funzione di ricerca delle stringhe è probabilmente il codice nativo, quindi questa ottimizzazione, che sarebbe in codice byte Java, potrebbe essere più lenta.

 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."); 

// senza usare espressioni regolari ……..

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

// questa è la versione aggiornata del codice che ho postato / * Il metodo isValidName controllerà se il nome passato come argomento non dovrebbe contenere- 1.valore o spazio 2. qualsiasi carattere speciale 3.Digits (0-9) Spiegazione– – Qui str2 è una variabile dell’array String che memorizza la stringa splitta di nome che viene passata come argomento La variabile count conta il numero di caratteri speciali che si verificano Il metodo restituisce true se soddisfa tutte le condizioni * /

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

nella riga String str2 [] = name.split (“”); dare un carattere in più in Array … Lasciatemi spiegare con l’esempio “Aditya” .split (“”) restituirebbe [, A, d, i, t, y, a] Avrai un carattere extra nel tuo array .. .
Il file “Aditya” .split (“”) non funziona come previsto dal routray saroj, si otterrà un carattere extra in String => [, A, d, i, t, y, a].

L’ho modificato, vedi sotto codice funziona come previsto

  public static boolean isValidName(String inputString) { String specialCharacters = " !#$%&'()*+,-./:;<=>[email protected][]^_`{|}~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; } } 

questo ha funzionato per me

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