정규식
테스터
정규식을 실시간으로 테스트하고 매칭 결과를 확인하세요
정규식(Regex) 완전 가이드
정규식(Regular Expression)은 문자열에서 특정 패턴을 찾거나 검증하는 강력한 문자 패턴 언어입니다. 기본 메타문자: .(임의 문자), *(0회 이상), +(1회 이상), ?(0 또는 1회), ^(시작), $(끝), [](문자 클래스), ()(그룹). 주요 플래그: g(전체 검색), i(대소문자 무시), m(멀티라인), s(줄바꿈 포함). 자주 쓰는 패턴: \d(숫자), \w(영숫자+언더스코어), \s(공백), \b(단어 경계), (?:)(비캡처 그룹), (?=)(전방 탐색). JavaScript RegExp 기준으로 실시간 처리되며, 이 도구에서 입력한 내용은 서버로 전송되지 않습니다.
활용 예시
- 이메일 검증: /^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,}$/ — 이메일 형식 확인
- 한국 휴대폰: /01[016-9]-?\d{3,4}-?\d{4}/ — 010-1234-5678 형식 검출
- URL 추출: /https?:\/\/[^\s]+/gi — 텍스트에서 URL 전체 추출
- 날짜 파싱: /\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])/ — YYYY-MM-DD 검증
- HTML 태그 제거: /<[^>]*>/g — 마크업 스트립
- 연속 공백 정리: /\s+/g → 공백 단일화
자주 묻는 질문
Q. g 플래그는 무엇인가요?
A. global 플래그로 문자열 전체에서 패턴과 일치하는 모든 항목을 찾습니다. g 없이는 첫 번째 일치만 반환합니다. JavaScript에서 exec()는 g 플래그와 함께 lastIndex를 이동하며 순회합니다.
Q. 한글을 매칭하는 정규식은?
A. [가-힣]+ 를 사용하면 한글 음절을 매칭할 수 있습니다. 자모 포함: [가-힣ㄱ-ㅎㅏ-ㅣ]+. 초성만: [ㄱ-ㅎ]+. 한글 단어 경계 처리에는 lookahead/lookbehind를 활용하세요.
Q. 이메일 유효성 검사 정규식은?
A. 프리셋에서 "이메일"을 클릭하면 바로 적용됩니다. RFC 5322 완전 준수 정규식은 매우 복잡하므로, 실무에서는 /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/ 수준을 사용하고 추가 로직으로 보완하는 것을 권장합니다.
Q. 정규식 특수문자를 그대로 매칭하려면?
A. 백슬래시(\)로 이스케이프합니다. 예) 점(.)을 매칭하려면 \., 괄호를 매칭하려면 \(, 물음표는 \?. . * + ? ^ $ { } [ ] | ( ) 가 이스케이프 필요 문자입니다.
Q. 전방 탐색(lookahead)은 무엇인가요?
A. (?=패턴)은 양의 전방 탐색으로, 뒤에 패턴이 있는 위치를 매칭하지만 패턴 자체는 캡처하지 않습니다. (?!패턴)은 음의 전방 탐색. 예) /\d+(?=px)/는 숫자 뒤에 "px"가 오는 숫자만 매칭합니다.
Q. 그룹과 캡처링이란?
A. ()는 캡처 그룹으로, 매칭된 부분을 별도로 추출합니다. (?:)는 비캡처 그룹으로 그룹화만 하고 추출하지 않습니다. (?<이름>)은 명명된 캡처 그룹. JavaScript에서 match()·exec()·replaceAll() 등에서 그룹 참조가 가능합니다.
Q. 탐욕적(greedy) vs 게으른(lazy) 매칭이란?
A. 기본적으로 *, +, ?는 탐욕적으로 최대한 많이 매칭합니다. 뒤에 ?를 추가하면(*?, +?, ??)게으른 매칭으로 최소한만 매칭합니다. 예) <.+>는 전체 HTML을 먹지만, <.+?>는 첫 태그만 매칭합니다.
Q. 정규식 성능을 개선하는 방법은?
A. 1) 재앙적 역추적(catastrophic backtracking)을 피하세요: 중첩된 정량자 (a+)+ 등. 2) 앵커(^, $)를 사용해 탐색 범위를 줄이세요. 3) 자주 쓰는 정규식은 변수에 저장해 재사용하세요. 4) 복잡한 패턴보다 문자열 메서드(includes, startsWith) 조합이 빠를 수 있습니다.
Q. m(multiline) 플래그는 어떻게 작동하나요?
A. m 플래그를 사용하면 ^와 $가 문자열 전체의 시작/끝이 아닌 각 줄의 시작/끝과 매칭됩니다. 여러 줄에 걸친 텍스트에서 줄별로 검증할 때 유용합니다. 예) /^\d+$/m는 여러 줄 중 숫자만 있는 줄을 찾습니다.
Q. 정규식으로 문자열을 치환(replace)하는 방법은?
A. JavaScript: str.replace(/패턴/g, 치환값) 또는 str.replaceAll(). 캡처 그룹 참조는 $1, $2로. 함수형 치환: replace(/패턴/g, (match, g1) => g1.toUpperCase()). 예) "hello world".replace(/(\w+)/g, match => match.toUpperCase()).
Q. 정규식과 입력값 보안에 주의할 점은?
A. 사용자 입력을 정규식에 직접 삽입하면 ReDoS(정규식 서비스 거부) 공격에 취약합니다. 반드시 특수문자를 이스케이프하세요: str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"). 또한 정규식 자체를 사용자가 입력하게 허용할 때는 실행 시간 제한을 두세요.
Q. 정규식 플래그 u(unicode)는 언제 사용하나요?
A. u 플래그는 유니코드 완전 지원 모드로, 이모지·4바이트 문자(서로게이트 페어)를 올바르게 처리합니다. /./u 는 이모지 하나를 하나의 문자로 인식합니다. /./없이는 이모지가 두 코드 유닛으로 분리됩니다. 유니코드 속성 이스케이프 \p{Letter}도 u 플래그와 함께 사용합니다.