2011-02-23 3 views
0

여기에 RegEx가 있습니다. 100 % 나쁜 이메일 주소는 생략하지만 완전히 이해할 수 없으므로 커뮤니티 전문가에게 전화해야합니다. 다음과 같이누구나이 정규식을 나에게 자세히 설명 할 수 있습니까?

문자열은 다음과 같습니다

^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*(.[a-zA-Z]{2,3})$ 

사전에 감사합니다! 조각에 의해

+2

아니, 100 %에서 찍은. – BoltClock

+0

제발 그 이상 자세한 내용을 줄 수 있습니까? – Yoda

+5

이것은 잘못된 전자 메일 주소를 허용하지만 유효한 [RFC 3598] (http://www.ietf.org/rfc/rfc3598.txt) 전자 메일 주소는 허용하지 않습니다. 바퀴를 재발 명하려고하지 마십시오. 해당 작업을위한 CPAN 모듈이 있습니다. – Alessandro

답변

8
^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*(.[a-zA-Z]{2,3})$ 

조각

^Start of the string 

    [_a-zA-Z0-9-]+ One or more characters of "_" (no quotes), a letter (a-z, A-Z), a number (0-9), or "-" (no quotes) 
    (.[_a-zA-Z0-9-]+)* zero or more substrings of type .something, or .123, or .a123. The substring must be formed by a . and a letter (same group of letters as before). So "." is not valid. ".a" or ".1" or ".-" is. 

당신이하지 수있는

@ a "@" (like [email protected]) 

    [a-zA-Z0-9-]+ One or more characters with the same pattern as before 
    (.[a-zA-Z0-9-]+)* Zero or more substrings of type ".something"... just as before 
    (.[a-zA-Z]{2,3}) A "." (dot) and 2 or 3 letters (a-z or A-Z) 

    $ The end of the string 

그래서 우리는 이메일 주소가 (지금까지이 예를 my.name12 또는 my.name12.surname34에 대해 받아 들일 것입니다) [email protected] (@ 앞에 "dangling"점 없음) 또는 [email protected] (시작 점이 없음). 도메인은 문자로 시작해야하며 첫 번째 수준 도메인 (.com/.uk/??) 바로 앞에 점을 사용할 수 없으므로 [email protected]이 아닙니다. 첫 번째 수준 도메인은 2 자 또는 3 자 (숫자 없음)이어야합니다.

\.이어야하므로 오류가 있습니다. . (도트)은 이스케이프해야합니다. 언어에 따라 \는 문자열에 이스케이프해야합니다 (그래서 \\. 수)

+5

정확한 이메일 주소가 무엇인지 판단하는 것이 얼마나 어려운지 알고 싶다면 http://en.wikipedia.org/wiki/Email_address – xanatos

+0

고맙습니다.이 코드를 자세히 설명해 주셨습니다. +1 – Yoda

+1

regexbuddy의 출력이 도움이 될 수 있습니다. http://img62.imageshack.us/i/dpreciousregex.png/ – hpavc

4

간단한 대답 :
또한 다음 유효 이메일 주소는해야하지만, 허용되지 것입니다 그것은하지 않습니다.

잘못된 전자 메일 주소가 반드시 잘못 포맷 된 것 ([email protected]이 올바른 형식이지만 여전히 나쁘다는 뜻)을 의미하지는 않지만 RegEx는 잘못된 주소도 허용합니다.

예를 들어, 가장 오른쪽 부분 ((.[a-zA-Z]{2,3})$)은 확인 된 문자열이 점으로 끝나야하고 2 ~ 3 자로 끝나야 함을 나타냅니다. 이 존재하지 않는 최상위 도메인 이름 (예를 들어, .aa)을 받아, 4 편지 TLD의를 차단합니다 (예를 들어, .INFO)

2
  • 이 정규식은 밑줄로 시작하는 이메일 주소를 받아 들일 것입니다. 그것은 (대부분) 받아 들일 수 없다.
  • "사용자 이름"의 크기 (즉, "@"기호 아래 부분)에 최소 한도를 두지 않았습니다. 따라서 단일 문자 사용자 이름은이를 무시합니다. 이전 예외와 결합하여 [email protected] 유형의 전자 메일 ID는 감지되지 않을 수 있습니다.
  • . (도트) 연산자는 임의의 문자를 허용합니다. 따라서 "@"부분 다음에 @@. com 등의 (유효하지 않은) 도메인은 감지되지 않을 수 있습니다.
  • 2 개 또는 3 개의 문자가있는 도메인 만 허용되며 나머지는 무시됩니다.
+2

밑줄로 시작하는 이메일 주소가 잘못되었습니다. – CanSpice

+0

단일 문자 사용자 이름을 사용하는 것이 잘못된 이유는 무엇입니까? – dolmen

2
[_a-zA-Z0-9-] 

경우에만 이러한 문자를 원하는 의미 - 귀하의 이메일 주소 (''영숫자 문자 또는 '_'또는)하지만이 모든 문자로 유효가 될 수 있습니다! # $ % & '* + -/=?^_`{| } ~

첫 번째 부분 (최대 @)은 최대 253 자 (최대 {1,253}) 여야하며 두 번째 부분 (최대 @)은 최대 64 자 ({4,64}) 여야합니다. 이 제외되지 않습니다 The Article On Wiki

2

번호 : 당신이 EmailAddress를 규범을 알고 싶다면 바로 위키피디아를 보면,

합니다 (({4,64}) 계수 한계를 넣기 전에 첫 번째 또는 두 번째 그룹에 괄호를 추가) 나쁜 이메일 주소의 100 %. 구문 적으로 유효한 주소의 대다수가 존재하지 않는 계정 (예 : [email protected])이기 때문에 모든 주소를 거부하는 것만으로는 성취하기가 불가능합니다.

전자 메일 주소의 정당성을 진정으로 확인하는 유일한 방법은 메일을 보내려는 것입니다. 심지어 그 주소에서 메일이 수락되었다는 것을 알려주고 사람이받는 것이 아니라고 말합니다. 대본을 받거나 조용히 버려지기를 반대하는 경우), 그것이 인간에 의해 접수되었다고하더라도, 자신이 소유하고 있다고 주장하는 사람은 아무런 보증을하지 않습니다. ("이메일 주소는 [email protected]입니다.")

16

정규식을 사용하여 이메일 주소의 유효성을 검사하지 마십시오. 이것은 다시 발명 할 필요가없는 바퀴이며, 끔찍한 털이 많은 정규 표현식을 작성하지 않으면 유효하지 않은 이메일 주소를 통과 시키거나 유효한 메일을 거부하게됩니다.

CPAN에는 Email::Valid과 같은 많은 모듈이있어 모든 것을 처리하고 시험 및 테스트를 거쳤습니다.

간단한 예 :

use Email::Valid; 
print (Email::Valid->address('[email protected]') ? 'yes' : 'no'); 

훨씬 간단하고, 단지 작동합니다. Mail::RFC822::Address을 사용 또는

: 정규 표현식이 성공적으로 모든 RFC822 호환 주소를 처리 할 수 ​​있어야합니다 얼마나 털이의 예를 들어

if (Mail::RFC822::Address::valid('[email protected]')) { ...} 

this beauty를보십시오.

전자 메일 주소 유효성 검사를 직접 수행하려는 사람들은 구문 상 유효하지 않은 주소를 통과시키고 심지어는 더 나쁜 경우 완벽하게 유효한 주소를 거부하는 코드로 끝나는 경향이 있습니다.

예를 들어 어떤 사람들은 [email protected]과 같이 주소에 +을 사용합니다.이를 "주소 태그"또는 "하위 주소 지정"이라고합니다. 유효성 확인에 대한 순진한 시도는이를 거부하고 고객은 다른 곳으로 이동하게됩니다.

또한 이전에는 TLD가 항상 2 또는 3 자라고 가정하는 사람들이있었습니다. 예를 들어 .info이 출시되면 해당 도메인의 주소를 가진 사람들은 완벽하게 유효한 이메일 주소가 허용되지 않는다고 전했다.

마지막으로 문법적으로 유효한 "Mickey Mouse"@example.com, [email protected][1.2.3.4]과 같은 일부 병리학 적 사례가 있지만 대부분의 사람들의 손으로 구속 된 유효성 확인은 거절합니다.

+2

내가 할 수 있으면 백 upvotes! – dsolimano

+0

그것이 속한 맨 위로 부딪 치십시오. – daxim

+0

모듈을 사용하거나 권장하기 전에 항상 RT 버그 대기열을 살펴보십시오. Mail :: RFC822 :: Address가 너무 많은 문자열을 허용합니다. https://rt.cpan.org/Ticket/Display.html?id=61288 – dolmen

-2

위의 모든 작성자는 .이 어떤 문자도 허용한다는 점을 인식하여 다른 RegEx 질문에 대한 응답으로이 편집 캡처 위젯이 백 슬래시를 먹는 것을 발견했습니다.

이 (! 그것이 문제입니다)

좋아요 ... 이제 제대로 만들어 보자 :

^\s*([_a-zA-Z0-9]+(\\.[_a-zA-Z0-9\\-\\%]+)\*)@([a-zA-Z0-9]+(\\.[a-zA-Z0-9\\-]+)\*(\\.[a-zA-Z]{2,4}))\s*$ 

이것은 또한 허용 - 내부 값으로 % 문자를 포함합니다. 이 루틴의 문제는 RegEx가 "greedy"이고 .com.edu과 일치하는 것으로 간주되는 종료 조건이 오버 슈팅 (overshoot)하기 때문에 전자 메일 주소를 파싱하는 것이 실제로 매우 효율적이지만 그다지 효율적이지 않습니다. , 상당한 CPU 시간을 소비하면서 되돌아 갈 필요가 있습니다.

실제 응답은 다른 포스터가 추천 한대로이 작업과 관련된 루틴을 사용하는 것입니다. CPAN 모듈이 없거나 타겟 환경이 없다면 RegEx 해킹은 틀림없이 받아 들여질 것입니다.

+1

로컬 부분에 여전히 유효한 구두점 문자가 누락되었습니다. 그리고 유효한 TLD와 일치하는 것에 대해 여전히 제한적입니다. [.museum] (http://index.museum/) –

관련 문제