Проверка электронной почты с использованием регулярных выражений - PullRequest
0 голосов
/ 16 августа 2011

Я обнаружил, что могу проверять ввод электронной почты с помощью регулярных выражений.Однако я не знаю, куда мне поместить выражения.Я помещаю их в мои методы контроллера Java, классы сущностей или JSP?

Ответы [ 4 ]

0 голосов
/ 17 августа 2011

Невозможно создать правильную проверку электронной почты только с помощью регулярных выражений.

Вот описание того, как (почти) правильно проверить адреса электронной почты.


Письма проверяются в соответствии с RFC 5321 и RFC 5322 . Ниже приведено упрощенное формальное определение синтаксиса электронной почты:

addr-spec = local-part "@" domain
local-part = dot-atom-text / quoted-string
dot-atom-text = atom *("." atom)
atom = 1*atext
atext = ALPHA / DIGIT / "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`" / "{" / "|" / "}" / "~"
ALPHA = ASCII characters in the range ‘a’ (ACSII code 0x61) through ‘z’ (ACSII code 0x7A) and ‘A’ (ACSII code 0x41) through ‘Z’ (ACSII code 0x5A)
DIGIT = ASCII characters in the range ‘0’ (ACSII code 0x30) through ‘9’ (ACSII code 0x39)
specials = "(" / ")" / "<" / ">" / "[" / "]" / ":" / ";" / "@" / "\" / "," / "."
quoted-string = “ *(qcontent) “
qcontent = qtext / quoted-pair
qtext = 0x21 / 0x23-0x5B / 0x5D-0x7E; All ASCII printable characters instead of “ and \
quoted-pair = \ (VCHAR / WSP)
VCHAR = 0x21-0x7E; All ASCII printable characters
WSP = 0x20 / 0x09; ASCII Space or tab characters

В дополнение к этим правилам указанная пара может быть размещена в любом месте внутри local-part . Обратите внимание, что специальная группа символов не используется. Эти символы не могут присутствовать ни в локальной части , ни в доменной части сообщения электронной почты. local-part может быть длиной до 64 символов, а domain domain может быть длиной до 255 символов (если это должно быть допустимое имя домена DNS), если объединено длина всего письма не более 256 символов.

Доменные имена проверяются в соответствии с RFC 1034 и RFC 1123 . Ниже приведено формальное определение синтаксиса доменного имени:

domain = subdomain / " " 
subdomain = label / subdomain "." label
label = let-dig *(*(ldh-str) let-dig)
ldh-str = let-dig-hyp / let-dig-hyp ldh-str
let-dig-hyp = let-dig / "-"
let-dig = ALPHA / DIGIT

Дополнительно RFC 1034 ограничивает домен до 255 символов ASCII и метку до 63 символов ASCII.

Хорошим началом является проверка правильности использования Apache (упомянутая в комментариях к вопросу). Он содержит как проверку домена, так и проверку электронной почты, хотя в прошлую проверку я обнаружил несколько ошибок в проверке электронной почты.

0 голосов
/ 16 августа 2011

Я думаю, вы можете создать класс EmailValidatorClass, который вы можете использовать в своем проекте всякий раз, когда вам нужно проверить адреса электронной почты:

import javax.mail.internet.InternetAddress;
import javax.mail.internet.AddressException;
import java.util.StringTokenizer;

/**
  * A class to provide stronger validation of email addresses.      
  *
  */
 public class EmailAddressValidator
 {
   public static boolean isValidEmailAddress(String emailAddress)
   {
     // a null string is invalid
     if ( emailAddress == null )
       return false;

     // a string without a "@" is an invalid email address
     if ( emailAddress.indexOf("@") < 0 )
       return false;

     // a string without a "."  is an invalid email address
     if ( emailAddress.indexOf(".") < 0 )
       return false;

     if ( lastEmailFieldTwoCharsOrMore(emailAddress) == false )
       return false;

     try
     {
       InternetAddress internetAddress = new InternetAddress(emailAddress);
       return true;
     }
     vcatch (AddressException ae)
     {
       // log exception
            return false;
     }
   }


   /**
    * Returns true if the last email field (i.e., the country code, or something
    * like .com, .biz, .cc, etc.) is two chars or more in length, which it really
    * must be to be legal.
    */
   private static boolean lastEmailFieldTwoCharsOrMore(String emailAddress)
   {
     if (emailAddress == null) return false;
     StringTokenizer st = new StringTokenizer(emailAddress,".");
     String lastToken = null;
     while ( st.hasMoreTokens() )
     {
       lastToken = st.nextToken();
     }

     if ( lastToken.length() >= 2 )
     {
       return true;
     }
     else
     {
       return false;
     }
   }
 }
0 голосов
/ 17 августа 2011
String expression = "[A-Za-z]+@+[A-Za-z]+\\.+[A-Za-z]{2,4}+$";
Pattern p = Pattern.compile(expression);
Matcher m = p.matcher(txtValidate.getText());
if(!m.matches())
{
JOpyionPane.showMessageDialog(null, "Email not valid");
}
0 голосов
/ 16 августа 2011

Если ваша электронная почта находится в строке, вы можете написать что-то вроде следующего для проверки электронной почты:

String email;
.
.  // load the email string
. 
if (email.matches("^[A-Za-z0-9_.]+[@][A-Za-z.]+$"))
{
.
.
.
}
else
    throw new EmailNotValidException();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...