2009-02-03 4 views
7

Я написал регулярное выражение ниже для действительно простой проверки электронной почты. Я планирую отправить ссылку подтверждения.regex для проверки электронной почты

/.*@[a-z0-9.-]*/i 

Я бы, однако, хотел бы расширить его из текущего состояния, так как строка, как это не дает желаемого результата:

тест, my.name + тест @ gmail-something.co. uk, test

Часть «тест», нежелательно включена в игру. Я безуспешно экспериментировал с границами слов.

  1. Как изменить?
  2. Несмотря на то, что я сохранил это просто, существуют ли какие-либо допустимые форматы электронной почты, которые он исключил бы?

СПАСИБО!

+0

Это было так часто ... Вы посмотрели на вопросы, которые были показаны после ввода вашего названия? – Tomalak

+0

http://stackoverflow.com/questions/201323/what-is-the-best-regular-expression-for-validating-email-addresses/201378#201378 –

ответ

1

Вместо. попробуйте соответствие каждый символ, за исключением \ S (пробел):

/[^\s]*@[a-z0-9.-]*/i 
+0

Чтобы соответствовать всем, кроме пробелов, мы не должны соответствовать (capital S) '\ S'? Если он не работает со всеми двигателями регулярных выражений. –

+0

^в начале квадратных скобок означает, что символы не указаны в этом списке. Таким образом, оно инвертирует значение f \ s. Наверное, вы могли бы использовать /\S*@[a-z0-9.-]*/i. –

14
+0

+1 для ссылки, которую я бы разместил (хотел бы я дайте +10!) –

+0

Я думаю, что это хороший кандидат на разгадку подкаста Джеффа и Джоэла о том, что не является удивительным ответом. Иногда вы можете просто хотеть, чтобы эвристика что-то делала и 98 процентов времени, люди с немыми адресами электронной почты могут сплевывать. –

+3

«Люди со странными адресами электронной почты могут сплевывать» Вы уволены. – alxp

-1

Джеффри Фридл дает регулярное выражение для проверки адреса электронной почты в его Mastering Regular Expressions книги. Он огромен, но он работает хорошо.

15

Это лот более сложный !!! См. Mail::RFC822::Address и испугайтесь ... очень страшно.

+0

Впервые я увидел это Regex, это сильно напугало меня, я показал его другу, и он не поверил мне, что это был EMAIL REGEX сначала, тогда он тоже был в ужасе. Хорошие воспоминания. –

+0

Почта :: RFC822 :: Адрес принимает гораздо больше, чем то, что обычно называют адресом электронной почты. См. Комментарий внизу, в котором говорится: «Это регулярное выражение будет проверять только адреса, у которых были сняты любые комментарии и заменены пробелами». Поэтому он принимает пробелы. – dolmen

-1

Меньшая два шага регулярное выражение дает хорошие результаты

/** проверить, если адрес электронной почты в правильном формате. * Ведущий характер почтового ящика должен быть альфа
* остальные символы буквенно-цифровой плюс -_ и точка
* домен Основание должно быть не менее 2 символов
* расширение домена должно быть не менее 2, не более 4 альфа
* Субдомены разрешены. * @version 050208 добавлен апостроф как действительный знак * @version 04/25/07 однобуквенный адрес электронной почты и один
* Доменные имена букв разрешены. */ public static boolean isValidEmailAddress (String address) { String sRegExp;

// 050208 using the literal that was actually in place 
    // 050719 tweaked 
    // 050907 tweaked, for spaces next to @ sign, two letter email left of @ ok 
    // 042507 changed to allow single letter email addresses and single letter domain names 
    // 080612 added trap and unit test for two adjacent @signs 
    sRegExp = "[a-z0-9#$%&]"   // don't lead with dot 
     + "[a-z0-9#$%&'\\.\\-_]*"  // more stuff dots OK 
     + "@[^\\.\\[email protected]]"    // no dots or space or another @ sign next to @ sign 
     + "[a-z0-9_\\.\\-_]*"   // may or may not have more character 
     + "\\.[a-z]{2,4}";   // ending with top level domain: com,. biz, .de, etc. 

    boolean bTestOne = java.util.regex.Pattern.compile(sRegExp, 
      java.util.regex.Pattern.CASE_INSENSITIVE).matcher(address).matches(); 

    // should this work ? 
    boolean bTwoDots = java.util.regex.Pattern.compile("\\.\\.", // no adjacent dots 
        java.util.regex.Pattern.CASE_INSENSITIVE).matcher(address).find(); 

    boolean bDotBefore = java.util.regex.Pattern.compile("[\\.\\s]@", //no dots or spaces before @ 
         java.util.regex.Pattern.CASE_INSENSITIVE).matcher(address).find(); 

    return bTestOne && !bTwoDots && !bDotBefore; 
} // end IsValidEmail 
1

Может стоить использовать проверенное регулярное выражение. Первая ссылка предполагает регулярные выражения для наиболее распространенных случаев:

http://www.regular-expressions.info/email.html

Но чтобы правильно выяснить, если адрес полностью RFC822 совместимый тогда:

http://instantbadger.blogspot.com/2006/08/regex-to-fully-validate-rfc822-email.html

+0

Еще один случай, когда кто-то вслепую говорит о Mail :: RFC822 :: Address без проверки. – dolmen

+0

@dolmen - почему ты так говоришь? – Kev

+0

Поскольку RFC822 (и RFC5822 также) не относятся к общим адресам электронной почты. Речь идет о адресах в контексте SMTP, а SMTP довольно либеральна в том, что она принимает. Вы должны подумать о всей цепочке программного обеспечения, которая будет обрабатывать адрес, а агенты передачи почты - всего лишь одна часть этого. Вы можете ожидать, что не каждое программное обеспечение на пути от вашего кода к глазам пользователя сможет обрабатывать полный набор RFC5822. – dolmen

0

это происходит от Regex Buddy (определенно необходимо купить прог!)

\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,6}\b 
+0

Он не соответствует домену верхнего уровня .museum. – dolmen

+0

@ Дольмен должен теперь. – Keng

6

Практически ничто из того, что вы используете, достаточно короткое, чтобы иметь смысл глядя на него, будет ИСТИННО проверять адрес электронной почты.При этом, как говорится, вот что я обычно использую:

^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ 

Это на самом деле построено в регулярных выражениях для регулярных выражений валидатора ASP.NET для адресов электронной почты.

ПРИМЕЧАНИЕ: многие из выражений, заданных в этой ветке, МОГУТ работать в 90-х годах, но TLD разрешено иметь менее 2 символов и более 4 символов в современной веб-среде. Например, [email protected] - действительный адрес электронной почты, потому что .museum - один из тех новых, длинных TLD.

+0

'_' соответствует \ w. Но «_» не допускается в именах доменов. Также у нас есть интернационализированные доменные имена (например, в арабском). – dolmen

+0

Это не проверяет пробелы, поскольку «joe [email protected]» возвращается как действительный адрес электронной почты. – Weggo

+1

@Weggo Это не позволяет пробелы. Если вы это делаете, возможно, вам не хватает каретки (^) в начале – Rick

3

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

  • Сначала проверьте существующие записи MX или A части домена через DNS-библиотеку.
  • Затем проверьте локальную часть (часть слева от @) на более простое регулярное выражение.

Причина для проверки DNS заключается в том, что недостижимые адреса электронной почты, хотя и совместимые с RFC, ничего не стоят. Причина дополнительной проверки A-записи заключается в том, что они используются для определения места доставки почты, когда MX-запись не найдена. (См RFC2821, 3.6)

Дополнительные советы:

  • Используйте надежные библиотеки DNS распознаватель, не свернуть свой собственный. Протестируйте его против крупных компаний. Они иногда имеют огромное количество почтовых серверов, что может привести к проблемам. Я видел багги-библиотеку на bmw.com. Просто говорю. :)
Смежные вопросы