툴박스 가이드는 W3C·MDN·국제 표준 문서(RFC/ISO)와 한국인터넷진흥원(KISA) 등 공신력 있는 기관의 공개 자료를 기반으로 작성·검토합니다.편집 방침 보기
정규표현식(Regular Expression, Regex)은 문자열 패턴을 표현하는 작은 언어입니다. 처음에는 외계어 같지만 한 번 익혀두면 텍스트 검색·치환·검증 작업 시간이 10배는 줄어듭니다. 이 글에서는 실무에서 가장 많이 쓰는 패턴을 카테고리별로 정리하고, 자주 틀리는 함정과 디버깅 팁까지 함께 다룹니다.
정규표현식 기본 메타문자 한눈에 보기
정규식의 핵심은 메타문자입니다. 외울 게 많아 보이지만 자주 쓰는 것은 10개 남짓입니다.
.: 줄바꿈을 제외한 임의의 한 문자*: 0회 이상 반복 (a*는 빈 문자열도 매치)+: 1회 이상 반복?: 0회 또는 1회 (옵션)^: 문자열의 시작$: 문자열의 끝[]: 문자 클래스 ([abc]는 a, b, c 중 하나)[^]: 부정 클래스 ([^0-9]는 숫자가 아닌 것)\d\w\s: 숫자, 단어 문자, 공백\D\W\S: 위의 부정형{n,m}: n회 이상 m회 이하 반복(): 그룹 캡처|: OR 선택
특히 \w는 [A-Za-z0-9_]와 동일하다는 점, \s에는 탭과 줄바꿈도 포함된다는 점은 자주 잊습니다. 언어마다 \d가 유니코드 숫자(아랍어 숫자 등)까지 포함할 수 있으니, ASCII 숫자만 받고 싶다면 [0-9]를 명시하는 게 안전합니다.
이메일·전화번호·URL 검증 패턴
실무에서 90%는 입력값 검증입니다. 가장 흔한 세 가지를 정리합니다.
이메일 (실용 버전):
^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
RFC 5322 완벽 호환 정규식은 한 줄로 6,000자가 넘기 때문에, 실무에서는 위처럼 "충분히 쓸 만한" 패턴을 씁니다. 진짜 정확도는 인증 메일을 보내서 확인하는 게 맞습니다.
한국 휴대폰 번호 (하이픈 포함/생략 모두 허용):
^01([0|1|6|7|8|9])-?(\d{3,4})-?(\d{4})$
그룹 캡처로 통신사·중간·끝 자리를 분리해서 정규화할 수 있습니다.
URL (http/https):
^https?://[\w.-]+(:\d+)?(/[\w./?%&=-]*)?$
쿼리스트링과 포트까지 허용합니다. 다국어 도메인까지 처리하려면 별도 라이브러리(예: url-parse)를 권장합니다.
계산기·체크리스트 같은 다른 개발자 유틸리티 도구도 한 번 확인해 보세요. JSON 디버깅과 정규식 테스트는 같이 자주 쓰는 조합입니다.
로그 파싱·치환에 쓰는 그룹과 백레퍼런스
로그에서 특정 패턴만 골라내거나 포맷을 바꿀 때는 그룹 캡처와 백레퍼런스가 핵심입니다.
Nginx access 로그에서 IP와 상태코드 추출:
^(\d+\.\d+\.\d+\.\d+) .* HTTP/\d\.\d" (\d{3})
첫 번째 캡처 그룹($1)이 IP, 두 번째($2)가 HTTP 상태 코드입니다.
날짜 포맷 변환 (2026-05-23 → 2026/05/23):
검색: (\d{4})-(\d{2})-(\d{2})
치환: $1/$2/$3
비밀번호처럼 보이는 줄 마스킹:
(password\s*=\s*)([^\s]+)
치환: $1**** — 키워드는 살리고 값만 가립니다. 보안 감사 직전 로그 정제에 자주 씁니다.
자주 틀리는 함정과 디버깅 팁
초보자가 가장 많이 빠지는 실수 세 가지입니다.
첫째, 탐욕적 매칭(greedy) 문제입니다. <.*>로 HTML 태그를 잡으면 <b>hi</b> 전체가 한 번에 잡힙니다. 비탐욕 매칭 <.*?>을 쓰거나, 더 엄격하게 <[^>]+>로 쓰는 게 안전합니다.
둘째, 이스케이프 누락입니다. .은 임의 문자이므로 점을 매칭하려면 \.로 써야 합니다. 192.168.0.1을 잡는다고 \d+.\d+.\d+.\d+로 썼다가 1234X567Y890Z123 같은 문자열이 매치되는 사고가 자주 납니다.
셋째, 앵커 누락입니다. ^/$ 없이 \d{4}만 쓰면 "전화번호 010-1234-5678" 안에 있는 1234도 매치됩니다. 검증용이라면 반드시 ^...$로 감싸세요.
디버깅할 때는 regex101.com 같은 시각화 도구를 쓰면 각 그룹이 무엇을 매치했는지 색으로 보여줘서 학습 효율이 폭발적으로 올라갑니다. 패턴이 길어질수록 코멘트 모드((?x))를 활용해 정규식을 여러 줄로 쪼개 주석을 다는 것도 유지보수에 큰 도움이 됩니다.
언어별 정규식 함수 빠른 참조
실무에서 자주 쓰는 언어별 함수 매핑입니다.
- JavaScript:
str.match(/pattern/),str.replace(/p/g, '...'),/p/.test(str) - Python:
re.match,re.search,re.findall,re.sub—re.compile로 미리 컴파일하면 빠릅니다 - Java:
Pattern.compile(...).matcher(str)— 컴파일 비용이 크니 반드시 캐싱 - Go:
regexp.MustCompile(...).FindStringSubmatch(str)— RE2 엔진이라 backtracking 폭발 위험이 없음 - Bash/grep:
grep -E '...'(확장 정규식),grep -P '...'(Perl 호환)
특히 사용자 입력을 정규식으로 받는 서비스는 ReDoS(정규식 서비스 거부) 공격을 조심해야 합니다. (a+)+처럼 중첩된 반복은 백트래킹이 폭발해 서버가 멈출 수 있습니다. 외부 입력은 RE2 같은 안전한 엔진에서 돌리거나, 타임아웃을 거는 게 안전합니다. 비밀번호·인증과 관련된 코드라면 실용 보안·생활 가이드도 같이 읽어 두면 좋습니다.
실전에서 바로 쓰는 정규식 체크리스트
복사해서 바로 쓰는 패턴 모음입니다.
- 한글만 허용:
^[가-힣]+$ - 영문+숫자 (비밀번호 기본):
^[A-Za-z0-9]{8,}$ - 강한 비밀번호 (영문 대소문자+숫자+특수문자):
^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[!@#$%^&*]).{8,}$ - IPv4:
^(\d{1,3}\.){3}\d{1,3}$(각 부분이 255 이하인지는 별도 검증 필요) - 한국 사업자등록번호:
^\d{3}-\d{2}-\d{5}$ - 한국 주민등록번호 앞자리:
^\d{6}-[1-4]\d{6}$(실제 로그에는 절대 남기지 말 것) - HTML 태그 제거:
<[^>]+>→ `` - 연속 공백을 하나로:
\s+→ - 줄 끝 공백 제거:
[ \t]+$
공휴일·연차 계산 같은 공휴일 캘린더 정보와 함께 쓰면 자체 자동화 스크립트를 빠르게 만들 수 있습니다. 예를 들어 휴일 데이터를 정규식으로 파싱해 사내 캘린더에 일괄 등록하는 식의 활용이 가능합니다.
관련 가이드
참고한 표준·공식 자료
본 글은 다음 표준·문서의 공개 자료를 바탕으로 정리·검토되었습니다. 최신 사양은 각 표준 문서를 함께 확인해 주세요.
- MDN Web Docs ↗웹 표준·HTML/CSS/JS 공식 문서
- W3C ↗웹 국제 표준 권고안
- IETF RFC Editor ↗인터넷 프로토콜·인코딩 표준 원문
- 한국인터넷진흥원(KISA) ↗보안·암호·개인정보 가이드
잘못된 정보나 갱신이 필요한 부분을 발견하셨다면 contact@kimgoon.kr로 알려주세요. 툴박스 편집 방침을 함께 참고하실 수 있습니다.








