정규식 테스터
JavaScript 정규식을 실시간으로 테스트하세요. 일치 부분이 강조되고 캡처 그룹까지 바로 볼 수 있어요.
강조된 일치 결과
일치 결과와 그룹
- 위 입력창에 정규식 패턴을 입력하세요. 양쪽 슬래시(/)는 감싸지 않아도 됩니다.
- 원하는 플래그를 켜세요. g는 모든 일치, i는 대소문자 무시 등.
- 테스트할 문자열을 "테스트 문자열" 상자에 붙여 넣거나 입력하세요.
- 일치 부분이 실시간으로 강조돼요. 아래 표에서 캡처된 그룹을 확인할 수 있어요.
어떤 도구인가요?
이 테스터는 브라우저에 내장된 RegExp 엔진으로 패턴을 실행합니다 — Node.js, Deno, 그리고 모든 브라우저가 쓰는 엔진과 같아요. 일치 부분은 그대로 하이라이트되고, 번호가 붙은 그룹과 이름이 붙은 그룹 모두 표로 뽑아 줘서 각 괄호가 무엇을 잡았는지 한눈에 볼 수 있어요.
예시
패턴 (플래그 g 포함):
\b(\w+)@(\w+\.\w+)\b 테스트 문자열:
Contact us at [email protected] or [email protected]. Not an email: foo@bar (no TLD). 일치:
1 [email protected] $1: hello $2: example.com
2 [email protected] $1: support $2: happycoder.dev foo@bar 는 \w+\.\w+ 가 도메인에 점을 요구하기 때문에 매치되지 않아요.
왜 내 정규식이 매치되지 않을까?
- g 플래그를 깜빡했어요. g 플래그가 없으면 첫 번째 일치만 반환돼요. /cat/.exec("cat cat") 은 "cat" 하나만 찾지만 /cat/g 는 둘 다 찾아요.
- 메타 문자를 이스케이프하지 않았어요. example.com 은 examplexcom 도 매치해요 — . 은 아무 문자나 매치하기 때문이에요. \ 로 이스케이프하세요: example\.com.
- 탐욕 매칭이 너무 많이 먹어요. <a><b> 에 <.*> 를 쓰면 전체를 잡아버려요. 지연(lazy) 버전 <.*?> 나 부정 클래스 <[^>]*> 를 써서 첫 > 에서 멈추게 하세요.
- 단어 경계가 헷갈려요. \b 는 단어 문자와 비단어 문자 사이의 위치예요. \bfoo-bar\b 같은 패턴은 - 자체가 이미 중간의 비단어 경계라서 실패합니다.
- 대소문자가 안 맞아요. [a-z]+ 로는 Hello 가 매치되지 않아요. i 플래그를 켜거나 [A-Za-z]+ 로 바꾸세요.
- 여러 줄에서의 ^ / $. m 플래그가 없으면 ^ 와 $ 는 전체 문자열의 시작/끝에만 붙어요. 로그를 줄 단위로 훑으려면 m 플래그를 켜세요.
자주 묻는 질문
이 테스터는 어떤 정규식 문법을 쓰나요?
JavaScript (ECMAScript) 정규식을 씁니다. 브라우저에 내장된 RegExp 엔진을 그대로 사용해요. PCRE (PHP, Perl), Python의 re 모듈, POSIX 정규식과는 몇 가지 차이가 있어요: 재귀 없음, 소유격 수량자 없음, 이름 있는 그룹은 (?P<name>...) 대신 (?<name>...) 형식이고, \d 같은 문자 클래스 단축표기는 u 플래그를 켜지 않으면 ASCII 범위에만 해당돼요.
룩비하인드(lookbehind)를 지원하나요?
네, 지원해요. (?<=foo)bar 와 (?<!foo)bar 같은 룩비하인드 단언은 ES2018에 추가됐고, 최신 Chromium, Firefox, Safari에서 모두 동작해요. 프로덕션에서 아주 오래된 브라우저까지 노려야 한다면 caniuse 를 확인하세요 — 이 테스터 자체에서는 문제없이 돌아갑니다.
g, i, m, s, u 플래그는 무슨 뜻인가요?
g 는 첫 번째만이 아닌 모든 일치를 찾아요. i 는 대소문자를 구별하지 않아요. m 은 ^ 와 $ 를 문자열 전체가 아니라 각 줄의 시작/끝에 맞춥니다. s (dotall) 는 . 이 개행 문자도 매치하게 해요. u 는 전체 유니코드 처리와 더 엄격한 이스케이프 파싱을 켭니다. 필요한 것만 고르세요 — 특히 g 는 매치 개수를 크게 바꿔요.
탐욕 수량자가 너무 많이 잡는데요?
*, +, {n,} 같은 수량자는 기본적으로 탐욕적이에요 — 가능한 한 많이 잡은 뒤, 뒤쪽 패턴이 실패할 때만 뒤로 물러납니다. ? 를 붙여 지연(lazy) 매칭으로 바꾸세요: .*? 는 최소한만 잡아요. <a>.*</a> 가 여러 태그를 삼키는 흔한 문제는 <a>.*?</a> 나 부정 클래스 <a>[^<]*</a> 로 해결합니다.
캡처한 그룹을 패턴이나 치환 문자열에서 어떻게 참조하나요?
패턴 안에서는 \1, \2 로 앞 그룹이 잡은 같은 텍스트를 다시 매치해요 — (\w+)\s+\1 은 반복된 단어를 잡아요. 치환 문자열(이 라이브 테스터에는 없지만 String.replace 에서)에서는 $1, $2 를 씁니다. 이름 있는 그룹은 패턴에서 \k<name>, 치환에서 $<name> 예요.
패턴에 점, 슬래시, 괄호가 들어가면 왜 깨지나요?
이들은 정규식 메타문자예요. 문자 그대로 매치하려면 역슬래시로 이스케이프하세요: 점은 \., 슬래시는 \/ ( new RegExp 문자열에서는 선택, /.../ 리터럴 사이에서는 필수), 괄호는 \( \) 입니다. 특수문자는 . * + ? ^ $ { } ( ) | [ ] \ — 이들 중 어느 것이든 리터럴로 쓰려면 이스케이프가 필요해요.
여기에 입력하는 정규식이나 테스트 텍스트를 저장하나요?
아니요. 입력하신 패턴이나 테스트 대상 텍스트는 저장하지 않습니다. 탭을 닫거나 새로고침하는 순간 모두 사라져요 — 로그도, 무엇을 매치했는지에 대한 기록도 남지 않아요. 브라우저 개발자 도구에서 직접 확인하실 수 있습니다.