2016-10-14 3 views
0

Passwort muss enthält: 1 Ober Brief 1 unteren Brief 1 Stelle 1 spezielles Symbol Minimum 8 SymboleRegex Kennwortüberprüfung wie spezielles Symbol unterstreicht hinzufügen

Hier ist es meine regex:

^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#[email protected]_$%^&*-]).{8,}$ 

Aber wenn ich versuche, zum Beispiel mit Passwort zu validieren: Test_123 gibt es mir false

hier ich ist mein Code:

public class PasswordCheck { 

    static Logger logger = Logger.getLogger(CommonHelper.class); 

    private static final String PASSWORD_PATTERN = "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#[email protected]_$%^&*-]).{8,}$"; 

    private Pattern pattern; 
    private Matcher matcher; 

    public PasswordCheck() { 
     pattern = Pattern.compile(PASSWORD_PATTERN); 
    } 

    /** 
    * Validate password with regular expression 
    * 
    * @param password 
    *   password for validation 
    * @return true valid password, false invalid password 
    */ 
    public boolean validate(final String password) { 

     matcher = pattern.matcher(password); 
     System.out.println(password); 
     System.out.println(matcher.matches()); 
     return matcher.matches(); 

    } 

} 

Ich versuche es gerade neuen String in validate Funktion mit dem gleichen Text zu setzen: Test_1523 und Rückkehr mich wahr, aber wenn ich diese Zeichenfolge über Rest-Service veröffentlichen und an die Funktion übergeben kehre mich falsch

+0

Ich überprüfe auf http://regexr.com/ und regex es ist ok, bitte könnten Sie Ihren Code posten? – aurox

+0

funktioniert auch für mich –

+0

Haben Sie den case insensitive Modifier gesetzt? –

Antwort

2

Egal, ob Sie reguläre Ausdrücke oder andere Mittel verwenden, um diese Zeichenfolgen zu validieren - aber bitte: schieben Sie nicht alles in ein Stück Code oder Regex.

Sie möchten Code erstellen, der leicht zu lesen und zu warten ist; und eine einzige Regex, die so viel "codiertes" Wissen enthält, wird dabei nicht helfen. Ich habe mehr als einmal verwendet so etwas wie

interface PasswordValidator { 
    boolean isValid(String input); 
    String getErrorMessage(); 
} 

Um dann verschiedene Klassen zu erstellen, eine solche Schnittstelle implementiert. Und schließlich erstellen Sie einfach ein Objekt pro Implementierungsklasse; und Sie können diese in eine statische Liste einfügen. Und dann bedeutet Validieren: Führen Sie einfach alle Validator-Objekte in dieser Liste aus. Bei einem Fehler können Sie direkt nach der Fehlermeldung für den Benutzer fragen (damit Sie ihm genau sagen können, was fehlt, anstatt den gesamten Regelsatz erneut auf ihn zu werfen).

Nicht sagen, dass so etwas immer erforderlich ist, aber meiner Erfahrung nach: Kennwortregeln können sich häufig ändern. Hard-Backen sie in Regexes ist selten eine dauerhafte Annäherung.

Verwandte Themen