정규식 테스트기·정규식 만들기베타
정규식 테스트·설명, 블록으로 정규식 만들기
이 도구는 아직 안정화 중인 베타 버전입니다. 결과가 예상과 다르면 알려주세요.
정규식 테스트·설명, 블록으로 정규식 만들기
자주 쓰는 패턴
일치 상세
패턴 설명
이 정규식으로 만들 수 있는 예시
지금 패턴에 들어맞는 문자열을 무작위로 만들어 봅니다. 패턴이 의도대로 동작하는지 빠르게 확인하는 용도입니다 (앵커가 없으면 일부만 일치할 수도 있습니다).
일부 조합은 정규식과 맞지 않아 제외했어요.
치환 미리보기
예시로 정규식 만들기
매칭하고 싶은 예시를 한 줄에 하나씩 넣으세요. 이들 전부를 매칭하는 정규식 초안을 만들어 줍니다 (완성본이 아니라 출발점).
불러오는 중…
처리 중…
0.0
멈춘 것이 아닙니다. 계산이 끝나면 결과가 표시됩니다.
정규식 테스트기·정규식 만들기 소개
이 도구는 입력한 패턴을 브라우저의 new RegExp(패턴, 플래그)로 컴파일해서 돌립니다. 즉 결과는 JavaScript(ECMAScript) 정규식 엔진 기준입니다. Python, Java, PCRE(PHP), grep에서 같은 패턴이 다르게 동작할 수 있으니, 다른 언어에 옮겨 쓸 패턴이라면 아래의 차이점을 먼저 확인하세요.
페이지에는 두 모드가 있습니다. 테스트 모드는 매치·캡처 그룹·치환 결과를 보여 주고 패턴을 토큰별로 풀어 설명합니다. 빌더 모드는 「숫자」「글자 그대로」「한글」 같은 블록을 쌓거나 예시 문자열을 넣어 패턴 초안을 만듭니다.
JavaScript 정규식이 다른 언어와 다른 점
- g 플래그가 없으면 첫 매치 하나만 찾습니다. 도구도 g가 없을 때는 「첫 매치만 표시」라고 알려 줍니다. Python의 re.findall처럼 전부 찾으려면 g를 켜세요.
- 이름 있는 그룹은 (?<name>...)이고, 치환에서는 $<name>, 번호는 $1, 매치 전체는 $&로 씁니다. Python re는 (?P<name>...)과 \g<name>을 씁니다.
- 룩비하인드 (?<=...), (?<!...)는 길이가 정해지지 않은 패턴도 됩니다. Python re는 고정 길이만 허용합니다. 다만 Safari는 2023년 3월(16.4)에야 룩비하인드를 지원했으므로, 그 이전 iOS 기기를 지원해야 하는 웹 코드에서는 문법 오류로 스크립트 전체가 멈출 수 있습니다.
- PCRE와 Java에 있는 원자 그룹 (?>...)과 소유 수량자 a++는 JavaScript에 없습니다. 아래 역추적 문제를 그 방식으로 막을 수 없다는 뜻입니다.
- \d, \w, \b는 u 플래그를 켜도 ASCII 기준입니다. \w는 [A-Za-z0-9_]라서 é나 한글을 단어 문자로 보지 않습니다.
u 플래그가 바꾸는 것
u 없이 JavaScript 문자열은 UTF-16 코드 단위로 다뤄집니다. 이모지 😀는 코드 단위 두 개라서 ^.$가 매치되지 않고, u를 켜야 한 글자로 매치됩니다. \p{Script=Hangul}이나 \p{L} 같은 유니코드 속성도 u(또는 v)가 있어야 뜻을 가집니다. u가 없으면 \p는 그냥 문자 p로 읽혀서 \p{L}+가 「p{L}}}」 같은 엉뚱한 문자열에 매치됩니다.
대소문자 무시(i)도 달라집니다. u 없이는 ſ(긴 s, U+017F)와 s가 같은 글자로 취급되지 않지만, u를 켜면 유니코드 대소문자 접기 규칙에 따라 매치됩니다. 한글 음절만 찾을 때 흔히 쓰는 [가-힣]은 완성형 음절 11,172자만 포함하고 ㄱ, ㅏ 같은 낱자모는 빠집니다. 빌더의 「한글」 블록도 [가-힣]입니다.
재앙적 역추적: 몇 글자에 브라우저가 멈추는 이유
JavaScript 엔진은 역추적(backtracking) 방식입니다. 매치에 실패하면 앞에서 내린 선택을 하나씩 바꿔 가며 다시 시도합니다. ^(a+)+$에 「aaaa…a!」를 넣으면 a들을 바깥·안쪽 반복으로 나누는 방법이 모두 시도되는데, 그 수가 a 하나마다 대략 두 배로 늘어납니다.
이 도구의 로직을 Node.js(V8)에서 직접 돌려 잰 값은 a 24개+!에 약 66ms, 26개에 약 254ms, 28개에 약 958ms, 30개에 약 3.9초였습니다. 같은 입력에서 ^a+$는 a가 1만 개여도 0.1ms 미만입니다. 컴퓨터마다 절대값은 다르지만 두 글자에 네 배씩 늘어나는 모양은 같습니다.
이 도구는 매칭을 Web Worker에서 실행하고 250ms 안에 끝나지 않으면 워커를 강제로 종료한 뒤 「너무 오래 걸림」을 표시합니다. 페이지는 멈추지 않지만, 서버 코드에서는 이런 보호 장치가 없으면 요청 하나가 CPU를 붙잡습니다(ReDoS). 고치는 방법은 중첩된 수량자를 풀어 같은 문자열을 여러 방식으로 나눌 수 없게 만드는 것입니다. (a+)+는 a+로, (\w+\s?)+는 \w+(?:\s\w+)*로 바꿉니다.
빌더 모드로 초안 만들기
빌더는 그룹을 한 단계까지만 중첩할 수 있게 해서 전화번호·날짜·코드 번호 같은 실무 패턴을 표현합니다. 예시 문자열을 여러 줄 넣으면 공통 구조를 찾아 초안을 만듭니다. 010-1234-5678과 010-9876-5432를 넣으면 ^\d{3}-\d{4}-\d{4}$가 나옵니다. 초안은 예시에 맞춘 것이라 너무 좁거나(국번이 세 자리인 번호) 너무 넓을 수 있으니, 테스트 모드에서 매치되면 안 되는 문자열도 함께 넣어 확인하세요.
예시
룩비하인드로 금액만 뽑기
- 입력
패턴 (?<=\$)\d+(?:\.\d{2})? 플래그 g 문자열 Total $19.99, tax $1.60, 30 items- 결과
19.99, 1.60 (2개)
$ 뒤에 오는 숫자만 매치되고 $ 자체는 결과에 포함되지 않습니다. 30은 앞에 $가 없어 빠집니다.
\b가 é를 모를 때
- 입력
패턴 \bcafé\b 플래그 g 문자열 café cafés- 결과
매치 1개: cafés 안의 café
é가 단어 문자가 아니라서 「café 」의 é와 공백 사이에는 경계가 없고, 「cafés」의 é와 s 사이에 경계가 생깁니다. 직관과 정반대 결과입니다.
이름 있는 그룹으로 날짜 순서 바꾸기
- 입력
패턴 (?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2}) 치환 $<d>.$<m>.$<y> 문자열 2026-09-22- 결과
22.09.2026 (치환 1회)
번호 대신 이름을 쓰면 그룹을 추가해도 치환 문자열을 고칠 필요가 없습니다.
사용 방법
- 패턴과 플래그를 입력하거나 자주 쓰는 패턴 목록에서 고릅니다.
- 테스트 문자열을 붙여 넣고 매치·캡처 그룹을 확인합니다.
- 필요하면 치환 문자열을 넣어 결과를 미리 봅니다.
- 패턴을 모르면 빌더 모드에서 블록이나 예시로 초안을 만듭니다.
자주 묻는 질문
여기서는 되는데 Python에서는 오류가 납니다.
(?<name>)은 Python에서 (?P<name>)으로, 길이가 변하는 룩비하인드는 고정 길이로 바꿔야 합니다. 치환의 $1은 Python에서 \1입니다.
「너무 오래 걸림」이 뜹니다.
재앙적 역추적입니다. (x+)+, (x|x)* 처럼 같은 글자를 여러 방식으로 나눌 수 있는 중첩 수량자를 찾아 하나로 합치세요.
\w로 한글이 안 잡힙니다.
JavaScript의 \w는 ASCII 영숫자와 _뿐입니다. 한글 음절은 [가-힣], 모든 언어의 글자는 u 플래그와 \p{L}을 쓰세요.
이모지 하나가 두 글자로 셉니다.
u 플래그를 켜세요. 없으면 UTF-16 코드 단위로 세서 서로게이트 쌍이 둘로 나뉩니다.
출처
- MDN: Regular expressions (JavaScript)
- MDN: Lookbehind assertion
- MDN: Unicode character class escape
- OWASP: Regular expression Denial of Service (ReDoS)
- Python docs: re module
기준일: