2016-05-03 12 views
1

Ich versuche, einen vorhandenen Regex-Ausdruck zu ändern, der aus einer Eigenschaftendatei aus einem Java-Programm stammt, das jemand anders erstellt hat.Dash zu Java Regex hinzufügen

Der aktuelle Regex Ausdruck verwendet, um eine E-Mail-Adresse entsprechen ist -

RR.emailRegex=^[a-zA-Z0-9_\\.][email protected][a-zA-Z0-9_]+\\.[a-zA-Z0-9_]+$ 

Die E-Mail-Adressen wie Spiele [email protected], aber jetzt einige E-Mail-Adressen haben Striche in ihnen wie [email protected] und diese stimmen nicht mit der Regex-Musterübereinstimmung überein.

Was würde mein neuer Regex-Ausdruck sein, um den Bindestrich zu dieser Übereinstimmung für reguläre Ausdrücke hinzuzufügen, oder gibt es eine bessere Möglichkeit, das darzustellen?

+0

Mögliche Duplikat [Verwenden eines regulären Ausdrucks eine E-Mail-Adresse zu bestätigen] (http: // Stackoverflow .com/questions/201323/using-a-regular-expression-zu-validieren-eine-email-adresse) – dustinroepsch

Antwort

0

Der korrekte Regex-Fix ist unten.

OLD Regex Expression

^[a-zA-Z0-9_\\.][email protected][a-zA-Z0-9_]+\\.[a-zA-Z0-9_]+$ 

NEW Regex Expression

^[a-zA-Z0-9_.+-][email protected][a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$ 
+0

müssen Sie nicht den Strich entkommen, wenn er zwischen eckigen Klammern steht? –

+0

Ich bin mir nicht 100% sicher, dass Regex ein bisschen schwierig für mich zu verstehen ist, aber die obige Änderung funktioniert und akzeptiert **[email protected]** als eine gültige E-Mail-Adresse in meinem Programm. – mattdonders

+0

Das liegt daran, dass er über den nicht-deklarierten '.' Zeichen überhaupt irgendeinen Charakter akzeptiert. Dies ist funktional das Gleiche wie '. * @. * \\ .. *' – Rogue

0

Bedeutung der - innerhalb einer Zeichenklasse ist anders als anderswo verwendet. Inside Zeichenklasse - bezeichnet Bereich. z.B. 0-9. Wenn Sie einfügen möchten, schreiben Sie es in den Anfang oder das Ende der Zeichenklasse wie [-0-9] oder [0-9-].

Sie müssen auch . innerhalb der Zeichenklasse nicht entkommen, da es als . buchstäblich innerhalb der Zeichenklasse behandelt wird.

Ihre Regex kann weiter vereinfacht werden. \w bedeutet [A-Za-z0-9_]. So können Sie

verwenden
^[-\w.][email protected][\w]+\.[\w]+$ 

In Java kann dies als

^[-\\w.][email protected][\\w]+\\.[\\w]+$ 
4

Basing auf der regex geschrieben werden Sie verwenden, können Sie den Bindestrich in Ihre Zeichenklasse hinzu:

RR.emailRegex=^[a-zA-Z0-9_\\.][email protected][a-zA-Z0-9_]+\\.[a-zA-Z0-9_]+$ 
add 
RR.emailRegex=^[a-zA-Z0-9_\\.-][email protected][a-zA-Z0-9_-]+\\.[a-zA-Z0-9_-]+$ 

Btw, können Sie Ihre Regex wie folgt abkürzen:

RR.emailRegex=^[\\w.-][email protected][\\w-]+\\.[\\w-]+$ 

Wie dem auch sei, ich würde Apache EmailValidator stattdessen wie folgt verwenden:

if (EmailValidator.getInstance().isValid(email)) .... 
0

^[a-zA-Z0-9_\\.\\-][email protected][a-zA-Z0-9_]+\\.[a-zA-Z0-9_]+$

Sollte Ihr Problem lösen. In Regex müssen Sie alles, was Bedeutung in der Regex-Engine hat (z. B. -,?, *, Usw.) entkommen lassen.

0

Eigentlich lese ich this post es alle Sonderfälle abdeckt, so die beste, die Arbeit richtig mit Java ist

String pattern ="(?:[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?|\\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-zA-Z0-9-]*[a-zA-Z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])";