정규표현식 레시피 이미지

정규표현식은 강력하지만 매번 처음부터 조립하는 것은 번거롭습니다. 이 글에서는 그대로 복사해 쓸 수 있는 실무용 정규표현식 레시피를, 무엇에 매칭되는지 설명과 함께 소개합니다. 더불어 글자 수 세기나 이스케이프 같은 일상적인 텍스트 처리 요령도 정리했습니다.

정규표현식의 기초 문법(메타 문자나 수량자의 의미)부터 배우고 싶다면 먼저 정규표현식의 기본을 읽으면 이해가 빠릅니다.

먼저 알아둘 것: 수량자와 문자 클래스

레시피에 앞서 자주 쓰는 부품만 확인해 둡니다.

패턴의미
\d숫자 한 글자([0-9])
\w영숫자와 언더스코어
\s공백 문자(스페이스·탭·줄바꿈 등)
.임의의 한 글자(줄바꿈 제외)
+직전을 1회 이상
*직전을 0회 이상
?직전을 0회 또는 1회
{2,4}직전을 2~4회
^ / $행의 시작 / 끝

복붙으로 쓰는 레시피

이메일 주소 추출

실무에서 “완전히 올바른” 이메일 정규식은 너무 복잡해 비현실적입니다. 로그나 텍스트에서 추출하는 용도라면 다음 실용 패턴으로 충분합니다.

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

[email protected] 같은 주소에 매칭됩니다.

URL 추출

https?://[\w./?=&%#-]+

http://https:// 양쪽에 대응합니다(s?가 “s는 0회 또는 1회”를 뜻합니다).

날짜(YYYY-MM-DD) 검증

^\d{4}-\d{2}-\d{2}$

2026-06-19 같은 형식에 매칭됩니다. ^$로 “행 전체가 이 형식인지”를 엄격히 검사합니다.

연속된 공백 정리(치환)

복붙으로 생긴 불필요한 공백을 정리하는 단골입니다.

검색:  \s+
치환:  (스페이스 1개)

\s+는 연속된 공백 덩어리에 매칭되므로 한꺼번에 하나로 줄일 수 있습니다.

캡처 그룹으로 순서 바꾸기

이름 성성 이름으로 바꾸는 등, 치환에서 그룹을 참조할 수 있습니다.

검색:  (\S+)\s+(\S+)
치환:  $2 $1

Taro YamadaYamada Taro처럼 변환할 수 있습니다($1 $2가 캡처한 부분의 참조).

정규표현식에서 빠지기 쉬운 점

  • 탐욕적 매칭: <.+>는 “첫 <부터 마지막 >까지”를 한꺼번에 삼킵니다. 최단 일치로 하려면 <.+?>처럼 ?를 붙입니다.
  • 메타 문자 이스케이프: . ? ( [ 등을 그대로 검색하려면 \.처럼 백슬래시로 이스케이프합니다.
  • 줄바꿈 넘기: .는 보통 줄바꿈에 매칭되지 않습니다. 여러 행을 다룰 때는 [\s\S]를 쓰거나 도구의 s 플래그를 켭니다.

작성한 패턴이 의도대로 동작하는지는 정규표현식 테스터에서 실제 텍스트에 적용해 하이라이트로 확인하는 것이 확실합니다. 치환 미리보기도 그 자리에서 볼 수 있습니다.

정규표현식이 필요 없는 ‘텍스트 처리’도 도구에 맡기기

정규표현식의 차례가 아닌, 수수하지만 자주 나오는 작업도 있습니다.

  • 글자 수 세기: SNS 게시물이나 메타 디스크립션의 글자 수 확인.
  • HTML 이스케이프: < > &를 실체 참조로 변환해 태그를 그대로 표시.
  • 대소문자·케이스 변환: snake_casecamelCase 상호 변환.
  • 중복 행 삭제·정렬: 목록 정리.

이러한 처리는 텍스트 정리 도구에 모아 두었습니다. 정규표현식과 구분해 쓰면 “텍스트와의 자잘한 싸움”을 줄일 수 있습니다.

자주 묻는 질문

정규표현식의 ?는 두 가지 의미가 있다고 들었습니다

맞습니다. a?처럼 수량자로 쓰면 “직전을 0회 또는 1회”를 뜻합니다. 한편 .+?처럼 수량자 바로 뒤에 붙이면 “최단 일치(비탐욕)” 지정이 됩니다. 위치에 따라 역할이 바뀌는 점에 주의하세요.

이메일 주소를 엄격히 검증하고 싶습니다

RFC에 완전히 준수하는 정규식은 실용에 견디기 어려울 만큼 복잡해집니다. 실무에서는 “@를 하나 포함하고 앞뒤에 문자가 있다” 정도의 느슨한 검증에 그치고, 실제로 유효한지는 확인 메일 발송으로 담보하는 것이 일반적입니다. 추출 용도라면 본문 중의 패턴으로 충분합니다.

언어에 따라 정규표현식 동작이 다른가요?

기본 문법은 공통이지만, 플래그 지정 방법(JavaScript의 /pattern/gi 등)이나 룩비하인드 지원 여부에 차이가 있습니다. 브라우저 테스터는 JavaScript 엔진으로 동작하므로 프론트엔드 코드에 넣기 전 확인에 적합합니다.