정규식 테스터
정규식을 입력하고 테스트 텍스트를 붙여넣으면 일치 항목이 실시간으로 강조 표시됩니다 — 캡처 그룹, 플래그, 명확한 오류 메시지까지 함께.
조회수 1,035회
0 개 일치
작동 원리
정규식은 리터럴 문자열이 아니라 문자의 패턴을 기술하므로, 짧은 표현 하나로 텍스트의 한 부류 전체와 매칭할 수 있습니다: 임의의 이메일 주소, 여러 형식의 임의의 전화번호, 로그 파일에서 "ERROR"로 시작하는 임의의 줄 등입니다. JavaScript 정규식을 입력하고 플래그(g 모든 일치, i 대소문자 구분 없음, m 여러 줄 앵커, s 점이 줄바꿈에도 일치, u 완전한 유니코드)를 켠 뒤 샘플 텍스트를 붙여넣으면, 모든 일치 항목이 본문 안에서 바로 강조되고 위치 및 캡처 그룹 정보와 함께 아래에 목록으로 표시됩니다. 괄호 ()는 캡처 그룹을 만드는데, 이는 일치가 일어났다는 사실만 아는 것이 아니라 일치한 텍스트의 특정 부분 — 예를 들어 이메일 주소의 도메인이나 날짜의 연도 — 을 따로 뽑아내는 방법입니다.
거의 모든 사람이 처음에 걸려 넘어지는 구분이 하나 있습니다: 탐욕적(greedy) 수량자와 게으른(lazy) 수량자입니다. .*는 탐욕적입니다 — 가능한 한 많은 텍스트를 매칭하려 하고, 필요할 때만 되돌아갑니다. <b>bold</b> and <i>italic</i>라는 입력에 대해 <.*> 패턴은 첫 번째 <부터 맨 마지막 >까지 탐욕적으로 매칭해 두 태그를 모두 삼켜버립니다. 여기에 ?를 붙여 .*?로 만들면 게을러져서 가능한 한 적게 매칭하므로, <.*?>는 첫 번째 >에서 멈추고 정확히 <b>만 매칭합니다. 이 구분이 바로 순진한 HTML 매칭 정규식이 실제 마크업에서 깨지는 정확한 이유입니다.
알아두어야 할 점
여기서 사용하는 엔진은 여러분 브라우저 자체의 네이티브 JavaScript(ECMAScript) 정규식 구현이므로, 여기서 일치하는 패턴은 여러분의 JS 코드에서도 동일하게 일치합니다 — 그 사이에 별도의 변환 계층이 끼어들지 않습니다. 다른 언어의 정규식 방언 — PCRE(PHP), Python의 re, Java의 Pattern — 은 핵심 문법(문자 클래스, 수량자, 그룹)의 대부분을 공유하지만 고급 기능에서는 갈라집니다: lookbehind 지원 여부, 이름 있는 그룹 문법, 소유형 수량자, 일부 이스케이프 시퀀스가 서로 다릅니다. 실제 서비스에 배포하기 전에는 항상 대상 언어에서 엣지 케이스를 다시 테스트하십시오.
치명적인 백트래킹에 주의하십시오: 중첩되거나 겹치는 수량자를 가진 패턴, 예를 들어 뒤에 "b"가 없는 긴 "a" 문자열에 대해 테스트하는 (a+)+b 같은 패턴은 엔진을 지수적인 백트래킹으로 몰아넣어 페이지를 — 같은 이유로 여러분의 운영 서버도 — 멈추게 만들 수 있습니다. 여기서 패턴이 멈춘다면 먼저 테스트 입력을 줄이고, 그다음 패턴 자체를 (대개 중첩된 반복을 아예 제거하는 방식으로) 재구성하십시오. CPU를 더 투입하는 것으로는 해결되지 않습니다. 모든 처리는 브라우저 안에서 로컬로 실행되며, 어떤 패턴이나 텍스트도 전송되지 않습니다.
자주 묻는 질문
어떤 정규식 방언을 사용하나요?
JavaScript(ECMAScript) — 브라우저 자체 엔진입니다. 패턴은 여러분의 JS 코드에서와 완전히 동일하게 동작합니다. PCRE와 Python은 대부분의 문법을 공유하지만 일부 고급 구문에서는 차이가 있습니다.
플래그는 각각 무슨 의미인가요?
g는 첫 번째 일치가 아니라 모든 일치를 찾습니다. i는 대소문자를 무시합니다. m은 ^와 $가 줄 단위로 매칭되게 합니다. s는 점(.)이 줄바꿈에도 매칭되게 합니다. u는 완전한 유니코드 처리를 활성화합니다.
패턴을 입력하면 왜 페이지가 멈추나요?
(a+)+b처럼 중첩된 수량자가 있는 패턴은 긴 입력에서 치명적인 백트래킹을 일으킬 수 있습니다. 테스트 텍스트를 줄이거나 패턴을 다시 구성하세요 — 실제 운영 코드에서도 같은 현상이 발생합니다.
캡처 그룹이란 무엇이고 왜 중요한가요?
패턴의 일부를 괄호로 감싸면 캡처 그룹이 만들어지며, 이는 전체 일치와는 별도로 그 특정 부분 문자열만 추출합니다 — 예를 들어 (\d{4})-(\d{2})-(\d{2})를 날짜와 매칭시키면 전체 문자열이 날짜처럼 보인다는 사실만 확인하는 대신 연도, 월, 일을 각각 세 개의 캡처로 얻을 수 있습니다. (?:...)로 작성하는 비캡처 그룹은 추가 캡처를 만들지 않고 구조적으로만 그룹화합니다.
패턴이 예상보다 더 많이(또는 더 적게) 매칭된 이유는 무엇인가요?
거의 항상 탐욕/게으름 불일치 때문입니다. .* 같은 수량자는 기본적으로 가능한 한 많이 움켜쥡니다. ?를 붙여(.*?, +?) 게으르게 만들면 마지막이 아니라 첫 번째로 가능한 지점에서 멈춥니다. 정규식이 여러 줄이나 태그에 걸쳐 과도하게 매칭될 때 대개 이 문자 하나가 해결책입니다.
비슷한 도구
문제 신고하기
정규식 테스터
댓글
아직 댓글이 없습니다 — 첫 댓글을 남겨보세요!