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


77

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

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

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

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

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;

}

14

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


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.


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.


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)


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)

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

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

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
  }

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.


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

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

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

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.


-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>
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.