C.W.K.
Stream
Lesson 01 of 12 · published

이메일 검증 — 합리적 기본

~10 min · email, validation

Level 0패턴 호기심
0 XP0/90 lessons0/15 achievements
0/100 XP to next level100 XP to go0% complete

99% 패턴

진짜 이메일 정규식 (RFC 5322 호환) 은 6,000 자 넘고 중첩 주석, quoted 문자열, IP 리터럴, Unicode 포함. 작성 시도 X. 합리적 production 기본은:

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

왼쪽에서 오른쪽:

  • [\w.+-]+ — local part: word 글자 + . + -
  • @ — 리터럴 at
  • [\w-]+ — 도메인 라벨 (안에 점 X)
  • \. — 리터럴 점
  • [\w.-]+ — 서브도메인과 하이픈 허용 TLD

이게 잡는 거

오타: 빠진 @, 빠진 TLD, 주소의 공백, 완전히 invalid 한 모양. "이게 이메일?" 사용 케이스의 약 95%.

이게 MISS 하는 거 (그래서 OK)

  • Quoted local part: "hello world"@example.com — 스펙상 유효, 거의 안 쓰임.
  • IP-리터럴 도메인: user@[192.168.1.1] — 동일.
  • 비-ASCII Unicode local part: 유저@한국.kr — Unicode 플래그 + 조정된 character class 필요.
  • 이메일이 실제로 존재하나.

진짜 "이 이메일 동작?" — 검증 메시지 발송. 정규식은 그거 못 알려줘.

HTML5 대안

브라우저 내장 type="email" 검증이 약간 더 permissive 한 정규식 사용. 브라우저면 그냥 사용: <input type="email" required>. 정규식 통째로 절약.

Code

이메일 검증·python
import re

EMAIL = re.compile(r'^[\w.+-]+@[\w-]+\.[\w.-]+$')

# 테스트
bool(EMAIL.fullmatch('hi@example.com'))         # True
bool(EMAIL.fullmatch('hi+tag@example.co.kr'))   # True
bool(EMAIL.fullmatch('user.name@sub.domain.org'))  # True

# 잡는 거
bool(EMAIL.fullmatch('no-at-sign'))             # False
bool(EMAIL.fullmatch('@no-local'))              # False
bool(EMAIL.fullmatch('hi@example'))             # False (TLD 없음)
bool(EMAIL.fullmatch('hi @example.com'))        # False (공백)

# 텍스트에서 이메일 찾기 (anchor 없이)
EMAIL_FIND = re.compile(r'[\w.+-]+@[\w-]+\.[\w.-]+')
re.findall(EMAIL_FIND, 'reach me at hi@pippa.dev or admin@cwk.io')
# ['hi@pippa.dev', 'admin@cwk.io']

External links

Exercise

본인 코드베이스에서 이메일 검증기 잡기. 위 99% 패턴과 비교. 본인 거 더 김? 추가 복잡성이 진짜 뭔가 잡나, 노이즈?

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.