[regex] 정규식을 사용하여 이메일 주소를 확인하는 방법은 무엇입니까?

지난 몇 년 동안 나는 IP 주소를 서버 부분으로 사용하지 않는다고 가정하면서 MOST 전자 메일 주소의 유효성을 올바르게 검사 하는 정규식 을 천천히 개발했습니다 .

여러 PHP 프로그램에서 사용하며 대부분 작동합니다. 그러나 때때로 나는 그것을 사용하는 사이트에 문제가있는 누군가와 연락을 취하고 조정해야합니다 (가장 최근에는 4 자 TLD를 허용하지 않는다는 것을 깨달았습니다).

이메일 확인에있어 가장 좋은 정규 표현은 무엇입니까?

여러 개의 짧은 표현식을 사용하는 함수를 사용하는 여러 솔루션을 보았지만 더 복잡한 함수의 여러 짧은 표현식 대신 간단한 함수에서 하나의 긴 복잡한 표현식을 사용하고 싶습니다.



답변

완전히 RFC 822 호환 정규 표현식은 비효율적 때문에 길이의 불분명. 다행히 RFC 822가 두 번 대체되었으며 현재 이메일 주소 사양은 RFC 5322 입니다. RFC 5322는 몇 분 동안 연구하면 이해할 수 있고 실제 사용하기에 충분히 효율적인 정규식으로 이어집니다.

하나의 RFC 5322 호환 정규 표현식은 http://emailregex.com/ 페이지 상단에서 찾을 수 있지만 00부호없는 바이트 10 진수 값 을 허용하는 버그로 인터넷 주위에 떠있는 IP 주소 패턴을 사용합니다 . 점으로 구분 된 주소로, 불법입니다. 나머지는 RFC 5322 문법과 일치하는 것으로 보이며 grep -Po도메인 이름, IP 주소, 잘못된 것, 따옴표가 있거나없는 계정 이름 등을 사용하여 몇 가지 테스트를 통과했습니다 .

00IP 패턴 의 버그를 수정하여 작동하고 상당히 빠른 정규식을 얻습니다. (실제 코드의 경우 마크 다운이 아닌 렌더링 된 버전을 폐기합니다.)

(? : [a-z0-9! # $ % & ‘* + / =? ^ _`{|} ~-] + (? : \. [a-z0-9! # $ % &’* + / =? ^ _`{|} ~-] +) * | “(? : [\ x01- \ x08 \ x0b \ x0c \ x0e- \ x1f \ x21 \ x23- \ x5b \ x5d- \ x7f] | \\ [\ x01- \ x09 \ x0b \ x0c \ x0e- \ x7f]) * “) @ (? : (? : [a-z0-9] (? : [a-z0-9-] * [a-z0) -9])? \.) + [a-z0-9] (? : [a-z0-9-] * [a-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-z0-9-] * [a-z0-9] : (? : [\ x01- \ x08 \ x0b \ x0c \ x0e- \ x1f \ x21- \ x5a \ x53- \ x7f] | \\ [\ x01- \ x09 \ x0b \ x0c \ x0e- \ x7f]) +) \])

또는:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-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-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

다음은 정규 표현식 자체보다 명확한 정규 표현식 위
유한 상태 머신 다이어그램 입니다.여기에 이미지 설명을 입력하십시오

Perl 및 PCRE의보다 정교한 패턴 (예 : PHP에서 사용되는 정규식 라이브러리)은 장애없이 RFC 5322를 올바르게 구문 분석 할 수 있습니다 . 파이썬과 C #도 그렇게 할 수 있지만 처음 두 가지와 다른 구문을 사용합니다. 그러나 덜 강력한 패턴 일치 언어 중 하나를 사용해야하는 경우 실제 구문 분석기를 사용하는 것이 가장 좋습니다.

또한 RFC에 따라 유효성을 검사하면 해당 주소가 제공된 도메인에 실제로 존재하는지 또는 주소를 입력 한 사람이 실제 소유자인지 여부를 전혀 알 수 없음을 이해하는 것이 중요합니다. 사람들은 항상 이런 방식으로 다른 사람들에게 메일 링리스트에 서명합니다. 주소와 동일한 웹 페이지에 입력되어야하는 확인 토큰을 포함하는 메시지를 해당 주소로 전송하는 것과 같은보다 강력한 종류의 유효성 검사가 필요한 수정.

확인 토큰은 입력 한 사람의 주소를 알 수있는 유일한 방법입니다. 이것이 대부분의 메일 링리스트가 가입을 확인하기 위해이 메커니즘을 사용하는 이유입니다. 결국, 누구나 내려 놓을 수 있고 president@whitehouse.gov, 그것은 합법적으로 파싱 될 것이지만, 다른 쪽 사람은 아닐 것입니다.

PHP의 경우 PHP 로 전자 메일 주소 확인에 제공된 패턴을 사용 해서는 안됩니다 .

일반적인 사용법과 광범위하게 조잡한 코딩이 기록 된 공식 표준보다 더 제한적인 전자 메일 주소에 대한 사실상의 표준을 확립 할 위험이 있습니다.

그것은 다른 모든 비 RFC 패턴보다 낫지 않습니다. RFC 5322는 물론 RFC 822 조차도 처리하기에 충분히 똑똑하지는 않습니다 . 그러나 이것은 하나 입니다.

화려하고 번거롭기를 원한다면 완전한 상태 엔진을 구현하십시오 . 정규식은 기초 필터로만 작동 할 수 있습니다. 정규 표현식의 문제점은 정규 표현식이 처리 할 수 ​​없기 때문에 완벽하게 유효한 전자 메일 주소가 유효하지 않다고 잘못 판단한다는 것입니다 (사용자의 입장에서는 무례하고 무례합니다). 목적을위한 상태 엔진은 각 RFC에 따라 전자 우편 주소를 분해 할 때 유효하지 않은 전자 우편 주소를 검증하고 정정 할 수 있습니다. 이것은 잠재적으로 더 즐거운 경험을 허용합니다.

지정된 이메일 주소 ‘myemail @ address, com’이 유효하지 않습니다. ‘myemail@address.com’을 의미 했습니까?

주석을 포함하여 이메일 주소 확인 도 참조하십시오 . 또는 정규식 확인 이메일 주소 비교 .

정규식 시각화

Debuggex 데모


답변

이메일 주소의 유효성을 검사하기 위해 정규식을 사용해서는 안됩니다.

대신 다음과 같이 MailAddress 클래스를 사용하십시오 .

try {
    address = new MailAddress(address).Address;
} catch(FormatException) {
    // address is invalid
}

MailAddress클래스는 BNF 파서를 사용하여 RFC822에 따라 주소의 전체 유효성을 검사합니다.

를 사용하여 MailAddress전자 메일 주소의 유효성을 검사하려는 경우이 방법 을 사용하면 전자 메일 주소의 표시 이름 부분도 허용되므로 정확하게 달성하려는 것이 아닐 수도 있습니다. 예를 들어 다음 문자열을 유효한 전자 메일 주소로 허용합니다.

  • “user1@hotmail.com; user2@gmail.com”
  • “user1@hotmail.com; user2@gmail.com; user3@company.com”
  • “사용자 표시 이름 user3@company.com”
  • “user4 @ company.com”

이러한 경우 중 일부에서는 문자열의 마지막 부분 만 주소로 구문 분석됩니다. 그 전의 나머지는 표시 이름입니다. 표시 이름없이 일반 전자 메일 주소를 얻으려면 정규화 된 주소를 원래 문자열과 비교하여 확인할 수 있습니다.

bool isValid = false;

try
{
    MailAddress address = new MailAddress(emailAddress);
    isValid = (address.Address == emailAddress);
    // or
    // isValid = string.IsNullOrEmpty(address.DisplayName);
}
catch (FormatException)
{
    // address is invalid
}

또한, 끝에 같은 점이있는 주소도 user@company.MailAddress에 의해 허용됩니다.

당신이 정말로 정규식을 사용하려면, 여기있다 :

(? : (? : \ r \ n)? [\ t]) * (? : (? : (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031 ] + (? : (? : (? : \ r \ n)? [\ t]
) + | \ Z | (? = [\ [ "() <> @,; :: \\". \ [\]])) | "(? : [^ \"\ r \\] | \\. | (? : (? : \ r \ n)? [\ t])) * "(? :( ?:
\ r \ n)? [\ t]) *) (? : \. (? : (? : \ r \ n)? [\ t]) * (? : [^ () <> @,; : \ \ ". \ [\] \ 000- \ 031] + (? :(? :(
? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; : \\". \ [\]])) | "(? : [ ^ \ "\ r \\] | \\. | (? : (? : \ r \ n)? [
\ t])) * "(? : (? : \ r \ n)? [\ t]) *)) * @ (? : (? : \ r \ n)? [\ t]) * (?: [^ () <> @,; : \\ ". \ [\] \ 000- \ 0
31] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; : \\". \ [\ ]])) | \ [([^ \ [\] \ r \\] | \\.) * \
] (? : (? : \ r \ n)? [\ t]) *) (? : \. (? : (? : \ r \ n)? [\ t]) * (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] +
(? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; :: \\". \ [\]]) ) | \ [([^ \ [\] \ r \\] | \\.) * \] (?:
(? : \ r \ n)? [\ t]) *)) * | (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (?: (? : (? : \ r \ n)? [\ t]) + | \ Z
| (? = [\ [ "() <> @,; : \\". \ [\]])) | "(? : [^ \"\ r \\] | \\. | (? :( ? : \ r \ n)? [\ t])) * "(? : (? : \ r \ n)
? [\ t]) *) * \ <(? : (? : \ r \ n)? [\ t]) * (? : @ (? : [^ () <> @,; : \\ "). \ [\] \ 000- \ 031] + (? : (? : (? : \
r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; :: \\". \ [\]])) | \ [([^ \ [\ ] \ r \\] | \\.) * \] (? : (? : \ r \ n)? [
 \ t]) *) (? : \. (? : (? : \ r \ n)? [\ t]) * (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (? : (? : (? : \ r \ n)
? [\ t]) + | \ Z | (? = [\ [ "() <> @,; : \\". \ [\]])) | \ [([^ \ [\] \ r \ \] | \\.) * \] (? : (? : \ r \ n)? [\ t]
) *)) * (? : ,, @ (? : (? : \ r \ n)? [\ t]) * (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (? : (? : (? : \ r \ n)? [
 \ t]) + | \ Z | (? = [\ [ "() <> @,; : \\". \ [\]])) | \ [([^ \ [\] \ r \\] | \\.) * \] (? : (? : \ r \ n)? [\ t]) *
) (? : \. (? : (? : \ r \ n)? [\ t]) * (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031 ] + (? : (? : (? : \ r \ n)? [\ t]
) + | \ Z | (? = [\ [ "() <> @,; :: \\". \ [\]])) | \ [([^ \ [\] \ r \\] | \\ .) * \] (? : (? : \ r \ n)? [\ t]) *)) *)
* : (? : (? : \ r \ n)? [\ t]) *)? (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (? : (? : (? : \ r \ n)? [\ t]) +
| \ Z | (? = [\ [ "() <> @,; : \\". \ [\]]))] "(? : [^ \"\ r \\] | \\. | ( ? : (? : \ r \ n)? [\ t])) * "(? : (? : \ r
\ n)? [\ t]) *) (? : \. (? : (? : \ r \ n)? [\ t]) * (? : [^ () <> @,; : \\ " . \ [\] \ 000- \ 031] + (? :(? :( ?:
\ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; : \\". \ [\]]))] ((:: [^ \ "\ r \\] | \\. | (? : (? : \ r \ n)? [\ t
])) * "(? : (? : \ r \ n)? [\ t]) *)) * @ (? : (? : \ r \ n)? [\ t]) * (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031
] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; : \\". \ [\] ])) | \ [([^ \ [\] \ r \\] | \\.) * \] (
? : (? : \ r \ n)? [\ t]) *) (? : \. (? : (? : \ r \ n)? [\ t]) * (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (?
: (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; : \\". \ [\]])) | \ [([^ \ [\] \ r \\] | \\.) * \] (? :(?
: \ r \ n)? [\ t]) *)) * \> (? : (? : \ r \ n)? [\ t]) *) | (? : [^ () <> @ ,; : \\ ". \ [\] \ 000- \ 031] + (? :(?
: (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; : \\". \ [\]])) | "(? : [^ \ "\ r \\] | \\. | (? : (? : \ r \ n)?
[\ t])) * "(? : (? : \ r \ n)? [\ t]) *) * : (? : (? : \ r \ n)? [\ t]) * (?: (? : (? : [^ () <> @,; : \\ ". \ [\]
\ 000- \ 031] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; : \\" . \ [\]])) | "(? : [^ \"\ r \\] |
\\. | (? : (? : \ r \ n)? [\ t])) * "(? : (? : \ r \ n)? [\ t]) *) (? : \. (? : (? : \ r \ n)? [\ t]) * (? : [^ () <>

@,; : \\ ". \ [\] \ 000- \ 031] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; : \\". \ [\]])) | "
(? : [^ \ "\ r \\] | \\. | (? : (? : \ r \ n)? [\ t])) *"(? : (? : \ r \ n)? [ \ t]) *)) * @ (? : (? : \ r \ n)? [\ t]
) * (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; : \\
". \ [\]])) | \ [([^ \ [\] \ r \\] | \\.) * \] (? : (? : (? : \ r \ n)? [\ t]) * ) (? : \. (? : (? : \ r \ n)? [\ t]) * (?
: [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; : \\". \ [
\]])) | \ [([^ \ [\] \ r \\] | \\.) * \] (? : (? : \ r \ n)? [\ t]) *)) * | (? : [^ () <> @,; : \\ ". \ [\] \ 000-
\ 031] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; : \\". \ [ \]])) | "(? : [^ \"\ r \\] | \\. | (
? : (? : \ r \ n)? [\ t])) * "(? : (? : \ r \ n)? [\ t]) *) * \ <(? : (? : \ r \ n)? [\ t]) * (? : @ (? : [^ () <> @ ,;
: \\ ". \ [\] \ 000- \ 031] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ ["() <> @,; : \\ ". \ [\]])) | \ [([
^ \ [\] \ r \\] | \\.) * \] (? : (? : \ r \ n)? [\ t]) *) (? : \. (? : (? : \ r \ n)? [\ t]) * (? : [^ () <> @,; : \\ "
. \ [\] \ 000- \ 031] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @, ; : \\ ". \ [\]])) \ [([^ \ [\
] \ r \\] | \\.) * \] (? : (? : \ r \ n)? [\ t]) *)) * (? :, @ (? : (? : \ r \ n )? [\ t]) * (? : [^ () <> @,; : \\ ". \
[\] \ 000- \ 031] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; : \\ ". \ [\]])) | \ [([^ \ [\] \
r \\] | \\.) * \] (? : (? : \ r \ n)? [\ t]) *) (? : \. (? : (? : \ r \ n)? [\ t]) * (? : [^ () <> @,; : \\ ". \ [\]
\ 000- \ 031] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; : \\" . \ [\]])) | \ [([^ \ [\] \ r \\]
| \\.) * \] (? : (? : \ r \ n)? [\ t]) *)) *) * : (? : (? : \ r \ n)? [\ t]) * )? (? : [^ () <> @,; : \\ ". \ [\] \ 0
00- \ 031] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; : \\". \ [\]])) | "(? : [^ \"\ r \\] | \\
. | (? : (? : \ r \ n)? [\ t])) * "(? : (? : (? : \ r \ n)? [\ t]) *) (? : \. (? :( ? : \ r \ n)? [\ t]) * (? : [^ () <> @,
; : \\ ". \ [\] \ 000- \ 031] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ ["( ) <> @,; : \\ ". \ [\]]))" "(?
: [^ \ "\ r \\] | \\. | (? : (? : \ r \ n)? [\ t])) *"(? : (? : \ r \ n)? [\ t ]) *)) * @ (? : (? : \ r \ n)? [\ t]) *
(? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; : \\".
\ [\]])) | \ [([^ \ [\] \ r \\] | \\.) * \] (? : (? : \ r \ n)? [\ t]) *) ( ? : \. (? : (? : \ r \ n)? [\ t]) * (? : [
^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | ( ? = [\ [ "() <> @,; : \\". \ [\]
])) | \ [([^ \ [\] \ r \\] | \\.) * \] (? : (? : \ r \ n)? [\ t]) *)) * \> ( ? : (? : \ r \ n)? [\ t]) *) (? :, \ s * (
? : (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; : \\
". \ [\]])) |"(? : [^ \ "\ r \\] | \\. | (? : (? : \ r \ n)? [\ t])) *"(? : (? : \ r \ n)? [\ t]) *) (? : \. (? :(
? : \ r \ n)? [\ t]) * (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (? :(? :(? : \ r \ n)? [\ t]) + | \ Z | (? = [
\ [ "() <> @,; : \\". \ [\]]))] "(? : [^ \"\ r \\] | \\. | (? : (? : \ r \ n)? [\ t])) * "(? : (? : \ r \ n)? [\ t
]) *)) * @ (? : (? : \ r \ n)? [\ t]) * (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (? : (? : (? : \ r \ n) ?? [\ t
]) + | \ Z | (? = [\ [ "() <> @,; :: \\". \ [\]])) | \ [([^ \ [\] \ r \\]] \ \.) * \] (? : (? : \ r \ n)? [\ t]) *) (?
: \. (? : (? : \ r \ n)? [\ t]) * (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + ( ? : (? : (? : \ r \ n)? [\ t]) + |
\ Z | (? = [\ [ "() <> @,; :: \\". \ [\]])) | \ [([^ \ [\] \ r \\] | \\.) * \] (? : (? : \ r \ n)? [\ t]) *)) * | (?:
[^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; : \\". \ [\
]]))] "(? : [^ \"\ r \\] | \\. | (? : (? : \ r \ n)? [\ t])) * "(? : (? : \ r \ n)? [\ t]) *) * \ <(? : (? : \ r \ n)
? [\ t]) * (? : @ (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "
() <> @,; :: \\ ". \ [\]])) | \ [([^ \ [\] \ r \\] | \\.) * \] (? : (? : \ r \ n)? [\ t]) *) (? : \. (? : (? : \ r \ n)
? [\ t]) * (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <>

@,; : \\ ". \ [\]])) | \ [([^ \ [\] \ r \\] | \\.) * \] (? : (? : \ r \ n)? [\ t]) *)) * (? :, @ (? : (? : \ r \ n)? [
 \ t]) * (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (? : (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,
; : \\ ". \ [\]]))] \ [([^ \ [\] \ r \\] | \\.) * \] (? : (? : \ r \ n)? [\ t]) *) (? : \. (? : (? : \ r \ n)? [\ t]
) * (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; : \\
". \ [\]])) | \ [([^ \ [\] \ r \\] | \\.) * \] (? : (? : (? : \ r \ n)? [\ t]) * )) *) * : (? : (? : \ r \ n)? [\ t]) *)?
(? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> @,; : \\".
\ [\]])) | "(? : [^ \"\ r \\] | \\. | (? : (? : \ r \ n)? [\ t])) * "(? :( ? : \ r \ n)? [\ t]) *) (? : \. (? :( ?:
\ r \ n)? [\ t]) * (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (? : (? : (? : \ r \ n)? [\ t]) + | \ Z | (? = [\ [
"() <> @,; : \\". \ [\]]))] "(? : [^ \"\ r \\] | \\. | (? : (? : \ r \ n) ? [\ t])) * "(? : (? : \ r \ n)? [\ t])
*)) * @ (? : (? : \ r \ n)? [\ t]) * (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (? : (? : (? : \ r \ n)? [\ t])
+ | \ Z | (? = [\ [ "() <> @,; :: \\". \ [\]])) | \ [([^ \ [\] \ r \\] | \\. ) * \] (? : (? : \ r \ n)? [\ t]) *) (? : \
. (? : (? : \ r \ n)? [\ t]) * (? : [^ () <> @,; : \\ ". \ [\] \ 000- \ 031] + (?: (? : (? : \ r \ n)? [\ t]) + | \ Z
| (? = [\ [ "() <> @,; : \\". \ [\]])) | \ [([^ \ [\] \ r \\] | \\.) * \] (? : (? : \ r \ n)? [\ t]) *)) * \> (? :(
? : \ r \ n)? [\ t]) *)) *)?; \ s *)


답변

이 질문은 많이 제기되지만 이메일 주소를 구문 적으로 검증하고 싶은 이유는 무엇입니까? 실제로 어떤 이점이 있습니까?

  • 일반적인 오타는 잡을 수 없습니다.
  • 사람들이 유효하지 않거나 구성한 전자 메일 주소를 입력하거나 다른 사람의 주소를 입력하는 것을 막지 않습니다.

전자 메일이 올바른지 확인하려면 확인 전자 메일을 보내서 사용자가 답장을 보내도록 선택할 수 있습니다. 많은 경우에 당신이 것 보안상의 이유로 윤리적 이유로 어쨌든 확인 메일을 보내 (그래서 할 수 있습니다 자신의 의지와 서비스까지하지 예를 들어, 기호 누군가).


답변

그것은 모두 당신이 얼마나 정확한지에 달려 있습니다. 내 목적을 위해 bob @ aol.com(이메일에 공백) 또는 steve(도메인이 전혀 없음) 또는 mary@aolcom(.com 이전에는 없음 ) 과 같은 것을 차단하려는 경우

/^\S+@\S+\.\S+$/

물론 유효하지 않은 이메일 주소와 일치하지만 일반적인 간단한 오류가 발생합니다.

해당 정규 표현식에 대해 많은 변경 사항이 있으며 일부는이 답변에 대한 의견에 있지만 간단하고 이해하기 쉽고 첫 번째 시도입니다.


답변

그것은 당신이 가장 의미하는 바에 달려 있습니다 : 유효한 모든 이메일 주소를 잡는 것에 대해 이야기하고 있다면 다음을 사용하십시오 :

(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:
\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(
?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[
\t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0
31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\
](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+
(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:
(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)
?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\
r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[
 \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)
?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t]
)*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[
 \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*
)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)
*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+
|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r
\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:
\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t
]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031
]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](
?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?
:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?
:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?
:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?
[ \t]))*"(?:(?:\r\n)?[ \t])*)*:(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\]
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|
\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>
@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"
(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?
:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[
\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-
\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(
?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;
:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([
^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\"
.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\
]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\
[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\
r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\]
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]
|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \0
00-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\
.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,
;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?
:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[
^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]
]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)(?:,\s*(
?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(
?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[
\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t
])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t
])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?
:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|
\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:
[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\
]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)
?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["
()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)
?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>
@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[
 \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,
;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:
\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[
"()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])
*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\
.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(
?:\r\n)?[ \t])*))*)?;\s*)

( http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html ) 더 간단한 것을 찾고 있지만 가장 유효한 이메일 주소를 찾으려면 다음과 같이 시도하십시오.

"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"

편집 : 링크에서 :

이 정규식은 주석이 제거되고 공백으로 대체 된 주소 만 유효성을 검사합니다 (모듈에서 수행함).


답변

[업데이트 됨] 이메일 주소 확인에 대해 내가 아는 모든 것을 여기에 정리했습니다 : http://isemail.info , 이제 이메일 주소의 문제를 검증 할뿐만 아니라 진단합니다. 유효성 검사는 답변의 일부일 뿐이라는 많은 의견에 동의합니다. http://isemail.info/about 에서 내 에세이를 참조하십시오 .

is_email ()은 내가 아는 한 주어진 문자열이 유효한 이메일 주소인지 아닌지를 확실하게 알려주는 유일한 유효성 검사기입니다. http://isemail.info/ 에서 새 버전을 업로드했습니다.

Cal Henderson, Dave Child, Phil Haack, Doug Lovell, RFC5322 및 RFC 3696에서 테스트 사례를 수집했습니다. 내가 찾은 모든 무료 유효성 검사기에 대해 이러한 모든 테스트를 실행했습니다.

사람들이 유효성 검사기를 향상시킬 때이 페이지를 최신 상태로 유지하려고합니다. 이 테스트를 컴파일하고 내 검증 자의 건설적인 비판에 도움을 주신 Cal, Michael, Dave, Paul 및 Phil에게 감사의 말을 전 합니다.

사람들은 특히 RFC 3696 에 대한 정오표를 알고 있어야합니다 . 정식 예제 중 3 개는 실제로 잘못된 주소입니다. 주소의 최대 길이는 320이 아닌 254 자 또는 256 자 입니다.


답변

은 W3C HTML5 사양 :

^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$

문맥:

유효한 이메일 주소 생산 ABNF […]을 일치하는 문자열이다.

참고 :이 요구 사항은 RFC 5322고의적 인 위반 으로 , 동시에 너무 엄격한 ( “@”문자 앞), 너무 모호한 ( “@”문자 뒤), 너무 느슨한 이메일 주소에 대한 구문을 정의합니다 ( 주석, 공백 문자 및 대부분의 사용자에게 친숙하지 않은 방식으로 인용 된 문자열)을 실제로 사용할 수 있습니다.

다음 JavaScript 및 Perl 호환 정규식은 위 정의를 구현 한 것입니다.

/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/