Überprüfen Sie, ob ein String ein Sonderzeichen enthält

77

Wie überprüfen Sie, ob ein String ein Sonderzeichen enthält wie:

[,],{,},{,),*,|,:,>,
Blau
quelle
2
Wofür ist das? Ich habe das böse Gefühl, dass dies eine Art Felddesinfektionsmittel ist, um beispielsweise SQL-Injection-Angriffe auf eine Website zu verhindern. Ach nein! Dies wäre nicht der richtige Weg, um das
Will
2
Sie müssen reguläre Ausdrücke verwenden.
Muhammad Imran Tariq

Antworten:

128
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");
oliver31
quelle
3
Sie müssen den richtigen Matcher und das richtige Muster importieren. import java.util.regex.Matcher; import java.util.regex.Pattern; Dieser Code eignet sich hervorragend zum Erzählen der übergebenen Zeichenfolge, die nur az und 0-9 enthält. Er gibt Ihnen keine Position des "schlechten" Zeichens oder dessen, was es ist, aber die Frage hat danach nicht gefragt. Ich denke, Regex ist eine großartige Fähigkeit für einen Programmierer, die ich beherrsche. Ich versuche es immer noch.
Jeff Porter
1
Wenn Sie das schlechte Zeichen anzeigen möchten, können Sie m.group () oder m.group (Index) verwenden
AITAALI_ABDERRAHMANE
Auf diese Weise können Sie alphanumerisch validieren. Wenn Sie Reg Ex ein wenig wie => [^ az] aktualisieren, werden nur Alpha-Zeichen überprüft.
Krishna Kumar Chourasiya
24

Mit dem folgenden Code können Sie Sonderzeichen aus Zeichenfolgen erkennen.

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;
 }
}
Ashish Sharma
quelle
Wenn mit "abc" verglichen wird, ergibt sich true, aber wenn mit "" verglichen wird, wird false angegeben.
Rahul Rastogi
21

Wenn Sie Buchstaben, Sonderzeichen und Zahlen in Ihrem Passwort mit mindestens 8 Ziffern haben möchten, verwenden Sie diesen Code, er funktioniert einwandfrei

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
quelle
14

Wenn es mit Regex übereinstimmt, enthält [a-zA-Z0-9 ]*es keine Sonderzeichen.

fastcodejava
quelle
Das ist nicht zuverlässig! Es wird nur nach gesucht a-zA-Z0-9. Versuchen Sie, dies mit der 123%#@ABCEingabe zu vergleichen. Es gibt true zurück.
R So
@ RSun Das würde false zurückgeben
stepanian
9

Wie nennt man genau "Sonderzeichen"? Wenn Sie etwas wie "alles, was nicht alphanumerisch ist" meinen, können Sie die Klasse org.apache.commons.lang.StringUtils (Methoden IsAlpha / IsNumeric / IsWhitespace / IsAsciiPrintable) verwenden.

Wenn es nicht so trivial ist, können Sie einen regulären Ausdruck verwenden, der die genaue Zeichenliste definiert, die Sie akzeptieren, und die Zeichenfolge damit vergleicht.

Michael Zilbermann
quelle
7

Alles hängt davon ab, was Sie unter "speziell" verstehen. In einem regulären Ausdruck können Sie angeben

  • \ W bedeutet nicht alpahnumerisch
  • \ p {Punct} bedeutet Interpunktionszeichen

Ich vermute, dass letzteres das ist, was du meinst. Wenn nicht, verwenden Sie eine [] -Liste, um genau anzugeben, was Sie möchten.

djna
quelle
6

Schauen Sie sich die java.lang.CharacterKlasse an. Es gibt einige Testmethoden, und Sie finden möglicherweise eine, die Ihren Anforderungen entspricht.

Beispiele: Character.isSpaceChar(c)oder!Character.isJavaLetter(c)

Andreas Dolk
quelle
3

Zuerst müssen Sie die Sonderzeichen, die Sie überprüfen möchten, vollständig identifizieren.

Dann können Sie einen regulären Ausdruck schreiben und verwenden

public boolean matches(String regex)
Varun
quelle
Es ist viel sicherer, eine Liste akzeptabler Zeichen zu erstellen und dies zu überprüfen.
Chris Nava
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
quelle
2

Das hat bei mir funktioniert:

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

Dies ist in Android 7.0 bis Android 10.0 getestet und es funktioniert

Verwenden Sie diesen Code, um zu überprüfen, ob die Zeichenfolge Sonderzeichen und Zahlen enthält:

  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 == true){
   //string contains special symbol/character
  }
  else if(containsNumber == true){
   //string contains numbers
  }
  else{
   //string doesn't contain special characters or numbers
  }
Jeanne vie
quelle
1

Besuchen Sie jedes Zeichen in der Zeichenfolge, um festzustellen, ob sich dieses Zeichen in einer schwarzen Liste von Sonderzeichen befindet. das ist O (n * m).

Der Pseudocode lautet:

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

Die Komplexität kann leicht verbessert werden, indem die schwarze Liste so sortiert wird, dass Sie jede Prüfung vorzeitig beenden können. Die String-Suchfunktion ist jedoch wahrscheinlich nativer Code, sodass diese Optimierung - die im Java-Bytecode erfolgen würde - möglicherweise langsamer ist.

Wille
quelle
1

// ohne regulären Ausdruck zu verwenden ........

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

// Dies ist eine aktualisierte Version des Codes, den ich gepostet habe. / * Die isValidName-Methode prüft, ob der als Argument übergebene Name nicht Folgendes enthalten sollte: 1. Nullwert oder Leerzeichen 2. Jedes Sonderzeichen 3. Ziffern (0-9) Erläuterung-- - Hier ist str2 eine String-Array-Variable, die die geteilte Zeichenfolge des Namens speichert, die als Argument übergeben wird. Die Zählvariable zählt die Anzahl der auftretenden Sonderzeichen. Die Methode gibt true zurück, wenn alle Bedingungen erfüllt sind * /

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

in der Zeile String str2 [] = name.split (""); Geben Sie ein zusätzliches Zeichen in Array an ... Lassen Sie mich anhand eines Beispiels erklären, dass "Aditya" .split ("") [, A, d, i, t, y, a] zurückgeben würde. Sie haben ein zusätzliches Zeichen in Ihrem Array. .
Die "Aditya" .split ( "") funktioniert nicht wie erwartet von saroj routray werden Sie ein zusätzliches Zeichen in String => [, A, D, i, t, y, a] erhalten.

Ich habe es geändert, siehe unten Code es funktioniert wie erwartet

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

quelle
0

Konvertieren Sie die Zeichenfolge in ein char-Array mit allen Buchstaben in Kleinbuchstaben:

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

Dann können Sie Character.isLetterOrDigit(c[index])herausfinden, welcher Index Sonderzeichen enthält.

Raj
quelle
-1

Verwenden Sie die statische Methode der Klasse java.util.regex.Pattern. Übereinstimmungen (Regex, String obj)
Regex: Zeichen in Klein- und Großbuchstaben und Ziffern zwischen 0 und 9
String obj: String-Objekt, das überprüft werden soll, ob es Sonderzeichen enthält oder nicht.

Der boolesche Wert true wird zurückgegeben, wenn nur Zeichen und Zahlen enthalten sind. Andernfalls wird der boolesche Wert false zurückgegeben.

Beispiel.

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>
}
Suraj Mahli
quelle