[Java] Reguläre Ausdrücke

newwarrior

Erfahrenes Mitglied
Hallo,

ich bin gerade dabei Java zu lernen, und stoße gerade bei Regulären Ausdrücken an ein Problem.
Und zwar habe ich ein kleines Script geschrieben um Passwörter zu überprüfen ob sie Klein und Großbuchstaben sowie Zahlen und Sonderzeichen enthalten und ob sie min. 16 Zeichen lang sind:

Java:
import java.util.*;
import java.util.regex.Pattern;

public class Hello
{
  public static void main( String[] args )
  {
      Scanner sc = new Scanner(System.in);
      int pwd_length = 16;
      
      System.out.println("Bitte geben Sie das Passwort ein was überprüft werden soll: "); 
      String password_user = sc.nextLine();
      if (Pattern.matches( "\\p{Punct}{1,1}\\w{1,1}\\d{1,1}", password_user ) == true)
      {
          if(password_user.length() >= pwd_length)
              System.out.println("Herzlichen Glückwunsch ihr Passwort, entspricht den Höchsten Sicherheitsvorschriften");
          else
             System.out.printf("Ihr Passwort ist zu kurz, es mus min. %d Zeichen lang sein", pwd_length);
      }
      else
          System.out.println("Ihr Passwort muss folgenden Angaben entsprechen: a-z A-Z 1-9 und Sonderzeichen");
  }
}

Folgender Teil macht mir Probleme:

Java:
Pattern.matches( "\\p{Punct}{1,1}\\w{1,1}\\d{1,1}", password_user )

Wenn ich es ja nicht falsch verstanden habe ist:
\\p{Punct}{1,1} => min. 1 Zeichen ein Sonderzeichen
\\w{1,1} => min 1. Zeichen ein Buchstabe
\\d{1,1} => min. 1 Zeichen eine Zahl

Doch es klappt nicht.
Habe ich einen Operator vergessen?
 
Zuletzt bearbeitet:

timestamp

Mitglied Käsekuchen
{1,1} bedeutet minimal 1, maximal ein. {min, max}. Für mind. 1 benötigst du {1,}.
Da die Reihenfolge egal ist, sollten das 3 reguläre Ausdrücke sein, die tu testest.
 

timestamp

Mitglied Käsekuchen
Wenn du willst das ein Kleinbuchstabe, ein Großbuchstabe, eine Ziffer und ein Sonderzeichen darin vorkommen MUSS, brauchst du dafür je einen Ausdruck. Wenn es vorkommen DARF reicht einer.
 

newwarrior

Erfahrenes Mitglied
Habe es jetzt so gemacht:

Java:
if (Pattern.matches( "\\d{1,}", password_user ) && Pattern.matches( "\\p{Punct}{1,}", password_user ) && Pattern.matches( "\\w{1,}", password_user ))

Mit diesem Passwort getestet:

aaaaBBBB11112222@@@@hhttzz66%%

Er sagt trotzdem zu mir, das es nivht passt
 
Zuletzt bearbeitet:

timestamp

Mitglied Käsekuchen
HonniCilest: Nein das ist schon richtig so.

Du hast aber 2 andere Fehler: Du maskierst die Zeichen \d, \p und soweiter mit einem Backslash. Das hat zur Folge das \\d als "\d" interpretiert wird, und nicht mehr als eine Ziffer. Entferne jeweils einen Backslash und arbeite nicht mit matches() sondern mit find().
 

HonniCilest

Erfahrenes Mitglied
Klar, wenn man mit find() arbeitet, dann hast du Recht. Pattern selbst hat aber kein find(), dafür benötigt er einen Matcher.

Java:
System.out.println(Pattern.compile("[abc]+").matcher("abcd").find());
 

newwarrior

Erfahrenes Mitglied
Klar, wenn man mit find() arbeitet, dann hast du Recht. Pattern selbst hat aber kein find(), dafür benötigt er einen Matcher.

Code java:

1

System.out.println(Pattern.compile("[abc]+").matcher("abcd").find());

Ich konnte es wie folgt lösen
Java:
if (Pattern.compile("\\d+").matcher(password_user).find() && Pattern.compile("\\p{Punct}+").matcher(password_user).find() && Pattern.compile("\\w+").matcher(password_user).find())
Danke.
Jedoch wenn ich den zweiten Backslash entferne bekomme ich vom Compiler eine Fehlermeldung.