2016-08-01 14 views
0

Ich benutze ein Email Validierungsmuster, das ich bei How to validate an email gefunden habe und es funktioniert gut, außer es erlaubt eine + im ersten Teil der E-Mail und das ist nicht in meinen Spezifikationen erlaubt. Der ursprüngliche Code istEmail Validierungsmuster Unclosed Zeichenklasse

public static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" 
     + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; 

protected boolean isInvalidEmail(String email) { 
    pattern = Pattern.compile(EMAIL_PATTERN); 
    matcher = pattern.matcher(email); 
    return !matcher.matches(); 
} 

Ich dachte, ich könnte nur die + von "^[_A-Za-z0-9-\\+] entfernen, aber ich bekomme eine Pattern Syntax Exception: Unclosed Character Class. Kann mir jemand sagen, warum das Entfernen der + die Klasse freigibt? Vielen Dank!

Antwort

2

Sie müssen den \\+ Teil entfernen.

\\ entkommt der \ Zeichen. \+ entgeht dem + Regex-Operator. So \\+ zerfällt auf \+, was bedeutet, dass die literalen + Zeichen entsprechen.

Hinweis: Der Regex-Operator + bedeutet eine Übereinstimmung mit einem oder mehreren der vorhergehenden Elemente.

+0

Es ist seltsam, dass sie das '\\ +' nach dem letzten '-' setzen, oder? Das '-' hat nur seine wörtliche Darstellung am Anfang oder Ende einer Zeichenklasse und fungiert ansonsten als Bereichsoperator. Die Quelle dieser Regex scheint also nicht vertrauenswürdig zu sein. –

+0

@AndrewCheong Ich dachte, das wäre auch seltsam, aber die [Top 5 Regex-Tester] (https://www.google.com/search?client=ubuntu&channel=fs&q=java+regex+tester&ie=utf-8&oe=utf- 8) zeige keine Fehler und stimmt mit gültigen Strings überein, wie 'example- @ email.com'. Wenn der Bindestrich jedoch nicht am Anfang oder Ende steht, sollte er mit Escapezeichen versehen werden ('\ -'). –

2

Der Grund, dass es Ihnen Unclosed Character Class gibt, ist, weil nur das Entfernen der + jetzt die schließende eckige Klammer entgeht, so wird es als Teil des Musters betrachtet. Daher hat die Klasse keine passende schließende eckige Klammer. Als Jonny Henly erwähnt, dass die Lösung ist, die \\+ zu entfernen, um mit Ihrer Spezifikation übereinzustimmen, aber das gibt die Antwort, warum es nicht geschlossen ist.

+0

* Dies gibt die Antwort, warum es nicht geschlossen ist * - +1 –