이메일을 맹목적으로 받아들이지 않도록 확인하는 가장 간단한 정규 표현식은 무엇입니까? [닫은]


80

사용자가 내 사이트에서 계정을 만들 때 모든 입력을 수락하지 않도록 이메일에 대한 서버 유효성 검사를 만들고 싶습니다 .

핸드 셰이크 유효성 검사 를 수행하는 방법으로 확인을 보냅니다 .

나는 최고가 아니라 단순하지만 아무것도 검증하지 않는 너무 단순하지 않은 것을 찾고 있습니다. 정규식으로 수행 할 수 없기 때문에 정규식이 올바른 유효성 검사를 수행하지 않기 때문에 제한이 어디에 있어야하는지 모르겠습니다.

정규 표현식에 내재 된 신택스와 시각적 복잡성을 제한하려고합니다.이 경우 어떤 것이 든 정확하기 때문입니다.

이를 위해 어떤 정규 표현식을 사용할 수 있습니까?


"가장 단순하다"는 것은 "최고", ceteris paribus와 똑같이 주관적이라고 생각했고, 그 스레드에는
정규식

정규식 유효성 검사를 수행하는 경우 식을 간단한 것으로 제한하는 이유는 무엇입니까? 좋은 것을 사용해 봅시다. 이것은 더 나은 결과를 제공하는 코드에 영향을 미치지 않습니다.
twk 2009

응용 프로그램에서이 유효성 검사는 어디에 있습니까? POST에서? 입력을 삭제하기 위해 무엇을하고 있습니까?
Braiam

^ (? i) [A-Z0-9 + _.-] + @ (? :. *). (? :. *) $, ^는 시작을, $는 끝을, (? i) 대소 문자를 구분하지 않는 일치를 나타냅니다. @ 앞에는 영숫자, '+', '_', '-'만 허용됩니다. 이 하나 : 어떤 부분 일치 하위 그룹 형성, 단 1 완전 일치?를
P 사티 Patro

답변:


99
^\S+@\S+$

3
잘못된 주소와 일치합니다. 모든 정규식이 가능하지만 이것은 test @ stackoverflow..com (이중 점에주의)과 같은 일반적인 오타와 일치합니다. 더 나은 예를 제공하십시오.
Mihai Limbășan 2009

62
그것은 최대한 간단하고 매우 거친 필터 여야하며, 왜 이중 기간이 비슷한 복잡성 비용을 가진 다른 모든 망가짐보다 두 배로 늘어 났는지 알 수 없습니다.
chaos

2
+1. 어쨌든 이것은 주관적인 질문이며 간단합니다.
Jason Cohen

2
예, 전체 검증 정규식을 사용하고 싶지 않다면 이것은 아주 간단한 근사치입니다
rampion

8
+1 정규식을 통해 전자 메일 주소를 완전히 "확인"하려는 것은 바보의 심부름입니다. 이것은 가장 단순한 잘못된 유형을 잡기 위해 작동합니다. 나머지는 메일을 보내면 찾을 수 있습니다. 위는 또한 대부분의 "영리한"정규식이 실패하는 유니 코드 (-> Punycode) 도메인을 허용합니다.
bobince

239

표준을 따르는 이메일 주소 만 허용하는 정규 표현식을 작성할 수 있습니다. 그러나 표준을 엄격하게 따르지 않지만 여전히 작동하는 이메일 주소가 있습니다.

다음은 기본 유효성 검사를위한 몇 가지 간단한 정규식입니다.

@ 문자 포함 :

@

@와 그 뒤에 마침표를 포함합니다.

@.*?\.

@ 앞, 마침표 앞, 뒤에 하나 이상의 문자가 있어야합니다.

.+@.+\..+

@ 앞, 마침표 앞과 뒤에 하나 이상의 @ 문자 만 있습니다.

^[^@]+@[^@]+\.[^@]+$

사용자 AmoebaMan17은 공백을 제거하기 위해 다음 수정을 제안합니다.

^[^@\s]+@[^@\s]+\.[^@\s]+$

그리고 한 기간 만 수락하는 경우 :

^[^@\s]+@[^@\s\.]+\.[^@\.\s]+$

7
RFC 6531을 통해 앞으로 나올 내용을 살펴보고 RFC 3696을 자세히 살펴보면 이메일을 확인하는 유일한 방법은 확인 이메일을 보내는 것뿐이라는 결론에 도달 할 것입니다. 이메일 주소에 정규식을 사용하는 데있어 진짜 초점은 사용자가 오타를 방지하는 데 있어야한다고 생각합니다. 바로 여기에서 이와 같은 간단한 정규식이 작동하게됩니다.
Bob Barker

완벽 해요, @ AmoebaMan17. RegEx는 이메일 주소 의 형식 을 확인할 수 있지만 이메일 주소의 내용 을 확인할 수는 없습니다 . 즉, 귀하는 형식을 완전히 검증합니다. 콘텐츠를 확인하는 유일한 방법은 이메일을 보내는 것입니다.
Craig

작동하지 test@test.com않습니까?
Abdul Hameed

1
마침표로 끝나는에서 문자열을 방지하기 위해,이 수정을했다 : ^ [^ @ \ S] + @ [^ @ \ S] + \ [^ @ \ \ s의.] + $.
fyrite

1
예, 마지막 것은 사용하지 마십시오. 유효한 옵션이 많지 않습니다. 예를 들어 me@provider.co.uk.
s.meijer

7

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

  • 단 1 @
  • 여러 도메인 및 하위 도메인

3

AmoebaMan17의 표현을 약간 변경하면 주소가 점으로 시작 / 종료되는 것을 막고 서로 옆에있는 여러 점을 막아야한다고 생각합니다. 일반적인 문제를 제거하면서 다시 복잡하게 만들지 않으려 고합니다.

(?!.*\.\.)(^[^\.][^@\s]+@[^@\s]+\.[^@\s\.]+$)

작동하는 것 같습니다 (하지만 저는 RegEx-pert가 아닙니다). 사용자가 마침표로 끝나는 문장 끝에서 이메일 주소를 복사하여 붙여 넣는 문제를 수정합니다.

예 : 여기 내 새 이메일 주소 tabby@coolforcats.com이 있습니다.


이것은 전에 @ 단일 문자 작동하지 않습니다
앤디 호일을

<script> alert ( 'hello') </ script> @ hello.com은이 정규식에 따라 유효합니다. 괜찮아 보이지 않습니다.
dudedev

1

선택해라.

다음은 RFC 2822 섹션 3.4.1 을 준수하는 것입니다 .

(?:[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])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-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])+)\])

호기심이 많을 경우를 대비하여. :)


7
지금보고있는 사람을위한 참고 사항 : RFC 2822를 준수하지 않습니다.
porges

11
그리고 그것도 간단하지 않습니다. :)
Dan Diplo

2
또한 유효한 이메일 주소 호스트를 차단합니다. 특히 국제 문자 / 언어를 사용하는 경우.
Bob Barker
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.