정규식 테스터

문자열에 대해 정규식을 테스트하고 모든 일치 항목 강조 표시

예시 시도

패턴

//g

테스트 문자열

로컬에서 실행 · 시크릿 붙여넣기 안전

정규식이란 무엇인가?

정규식(regex 또는 regexp)은 검색 패턴을 정의하는 문자열입니다. 정규식 테스터를 사용하면 패턴을 작성하고, 샘플 텍스트에 실행하여, 모든 일치 항목이 실시간으로 강조 표시되는 것을 확인할 수 있습니다. 이 개념은 1950년대 수학자 스티븐 클리니(Stephen Kleene)의 정규 언어 연구로 거슬러 올라가며, 켄 톰슨(Ken Thompson)은 1968년 QED 텍스트 편집기에 최초의 정규식 엔진을 구현했습니다.

정규식 엔진은 패턴을 왼쪽에서 오른쪽으로 읽으며 일치를 시도하는 과정에서 입력 문자를 소비합니다. 부분 일치가 실패하면 백트래킹을 사용하여 이전 단계로 돌아가 패턴의 다른 경로를 시도합니다. Go에서 사용하는 RE2와 같은 일부 엔진은 패턴을 결정론적 유한 오토마타(DFA)로 변환하여 백트래킹을 완전히 피하는데, 이는 역참조(back-reference)와 같은 기능을 지원하지 않는 대신 선형 시간 일치를 보장합니다.

정규식 문법은 느슨하게 표준화되어 있습니다. PCRE(Perl Compatible Regular Expressions)가 가장 널리 사용되는 방식으로, PHP, Python의 re 모듈, 그리고 약간의 차이가 있는 JavaScript에서 지원됩니다. POSIX는 grep과 sed에서 사용하는 보다 제한적인 문법을 정의합니다. 언어 간에 패턴을 이식할 때 이 차이는 중요합니다. JavaScript에서 동작하는 전방 탐색(lookahead)이 Go의 RE2 엔진에서는 컴파일조차 되지 않을 수 있습니다.

온라인 정규식 테스터를 사용하는 이유

코드 파일에서 정규식을 작성하면 패턴을 수정할 때마다 저장, 실행, 결과 확인을 반복해야 합니다. 브라우저 기반 정규식 테스터는 이 피드백 주기를 제로로 줄여줍니다. 입력하는 즉시 일치 결과를 확인할 수 있습니다.

실시간 일치 항목 강조 표시
키 입력마다 일치 결과가 즉시 업데이트됩니다. 텍스트의 어느 부분이 일치하는지, 어떤 캡처 그룹이 채워졌는지, 각 일치가 정확히 어디서 시작하고 끝나는지 확인할 수 있습니다. 컴파일-실행-디버그 주기가 필요 없습니다.
🔒
개인 정보 보호 우선 처리
패턴 매칭은 JavaScript RegExp 엔진을 사용하여 브라우저에서 실행됩니다. 텍스트나 패턴은 서버로 전송되지 않습니다. 로그 파일, 고객 데이터, 또는 민감한 정보가 포함된 API 응답에 대해 테스트할 때 중요한 점입니다.
🔍
시각적 일치 항목 검사
일치 항목은 위치 및 캡처 그룹 값과 함께 인라인으로 강조 표시됩니다. 일치 항목을 시각적으로 확인하면 수량자의 오차나 누락된 앵커를 더 쉽게 발견할 수 있습니다.
🌐
로그인 또는 설치 불필요
최신 브라우저가 있는 모든 기기에서 사용 가능합니다. 계정, 확장 프로그램, IDE 플러그인이 필요 없습니다. 페이지를 열고 패턴과 텍스트를 붙여넣으면 바로 테스트할 수 있습니다.

정규식 테스터 활용 사례

프론트엔드 입력 유효성 검사
이메일, 전화번호, 신용카드 입력 필드용 패턴을 HTML5 pattern 속성이나 JavaScript 유효성 검사 로직에 삽입하기 전에 패턴을 작성하고 검증합니다.
백엔드 로그 파싱
애플리케이션 로그에서 타임스탬프, 오류 코드, 또는 IP 주소를 추출하는 정규식 패턴을 작성합니다. 실제 로그 샘플에 대해 테스트하여 패턴이 올바른 그룹을 캡처하는지 확인합니다.
DevOps 및 인프라
Nginx location 블록, Apache 재작성 규칙, 또는 Prometheus 알림 규칙에서 사용되는 정규식을 디버깅합니다. 서버 설정에서 잘못된 패턴은 라우팅을 중단시키거나 알림을 놓치게 만들 수 있습니다.
QA 및 테스트 자동화
엔드-투-엔드 테스트 단언문에서 응답 본문이나 HTML 출력이 예상 패턴과 일치하는지 검증합니다. 테스트 스위트에 커밋하기 전에 여기서 정규식을 미리 테스트합니다.
데이터 추출 파이프라인
비정형 텍스트에서 구조화된 필드를 추출하는 패턴을 프로토타입으로 만듭니다. 제품 가격 스크래핑, CSV 엣지 케이스 파싱, 이메일 헤더에서 메타데이터 추출 등에 활용합니다.
정규식 학습
메타문자, 수량자, 그룹을 샘플 문자열에 실험해 보세요. 즉각적인 시각적 피드백 덕분에 문서만 읽는 것보다 정규식 문법을 훨씬 쉽게 배울 수 있습니다.

정규식 문법 빠른 참조

아래 표는 가장 많이 사용되는 정규식 토큰을 다룹니다. JavaScript, Python, Go, PHP 및 대부분의 PCRE 호환 엔진에서 동작합니다. 언어별 확장 기능(Python의 조건부 패턴이나 \k 문법을 사용하는 JavaScript의 명명된 그룹 등)은 코드 예제 섹션에서 설명합니다.

패턴이름설명
.Any characterMatches any single character except newline (unless s flag is set)
\dDigitMatches [0-9]
\wWord characterMatches [a-zA-Z0-9_]
\sWhitespaceMatches space, tab, newline, carriage return, form feed
\bWord boundaryMatches the position between a word character and a non-word character
^Start of string/lineMatches the start of the input; with m flag, matches start of each line
$End of string/lineMatches the end of the input; with m flag, matches end of each line
*Zero or moreMatches the preceding token 0 or more times (greedy)
+One or moreMatches the preceding token 1 or more times (greedy)
?OptionalMatches the preceding token 0 or 1 time
{n,m}Quantifier rangeMatches the preceding token between n and m times
()Capturing groupGroups tokens and captures the matched text for back-references
(?:)Non-capturing groupGroups tokens without capturing the matched text
(?=)Positive lookaheadMatches a position followed by the given pattern, without consuming it
(?<=)Positive lookbehindMatches a position preceded by the given pattern, without consuming it
[abc]Character classMatches any one of the characters inside the brackets
[^abc]Negated classMatches any character not inside the brackets
|AlternationMatches the expression before or after the pipe

정규식 플래그 설명

플래그(수정자라고도 함)는 엔진이 패턴을 처리하는 방식을 변경합니다. JavaScript에서는 닫는 슬래시 뒤에 추가합니다: /pattern/gi. Python에서는 두 번째 인수로 전달합니다: re.findall(pattern, text, re.IGNORECASE | re.MULTILINE). 모든 플래그가 모든 언어에서 사용 가능한 것은 아닙니다.

플래그이름동작
gGlobalFind all matches, not just the first one
iCase-insensitiveLetters match both uppercase and lowercase
mMultiline^ and $ match start/end of each line, not just the whole string
sDot-all. matches newline characters as well
uUnicodeTreat the pattern and subject as a Unicode string; enables \u{FFFF} syntax
yStickyMatches only from the lastIndex position in the target string

코드 예제

JavaScript, Python, Go, 그리고 커맨드라인에서의 정규식 예제입니다. 각 예제는 패턴 구성, 일치 항목 추출, 출력을 보여줍니다.

JavaScript
// Match all email addresses in a string
const text = 'Contact us at support@example.com or sales@example.com'
const emailRegex = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g

const matches = text.matchAll(emailRegex)
for (const match of matches) {
  console.log(match[0], 'at index', match.index)
}
// → "support@example.com" at index 14
// → "sales@example.com" at index 37

// Named capture groups (ES2018+)
const dateRegex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/
const result = '2026-03-30'.match(dateRegex)
console.log(result.groups)
// → { year: "2026", month: "03", day: "30" }

// Replace with a callback
'hello world'.replace(/\b\w/g, c => c.toUpperCase())
// → "Hello World"
Python
import re

# Find all IPv4 addresses
text = 'Server 192.168.1.1 responded, fallback to 10.0.0.255'
pattern = r'\b(?:\d{1,3}\.){3}\d{1,3}\b'

matches = re.findall(pattern, text)
print(matches)  # → ['192.168.1.1', '10.0.0.255']

# Named groups and match objects
date_pattern = r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
m = re.search(date_pattern, 'Released on 2026-03-30')
if m:
    print(m.group('year'))   # → '2026'
    print(m.group('month'))  # → '03'

# Compile for repeated use (faster in loops)
compiled = re.compile(r'\b[A-Z][a-z]+\b')
words = compiled.findall('Hello World Foo bar')
print(words)  # → ['Hello', 'World', 'Foo']
Go
package main

import (
	"fmt"
	"regexp"
)

func main() {
	// Find all matches
	re := regexp.MustCompile(`\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\b`)
	text := "Contact support@example.com or sales@example.com"
	matches := re.FindAllString(text, -1)
	fmt.Println(matches)
	// → [support@example.com sales@example.com]

	// Named capture groups
	dateRe := regexp.MustCompile(`(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})`)
	match := dateRe.FindStringSubmatch("2026-03-30")
	for i, name := range dateRe.SubexpNames() {
		if name != "" {
			fmt.Printf("%s: %s\n", name, match[i])
		}
	}
	// → year: 2026
	// → month: 03
	// → day: 30

	// Replace with a function
	result := re.ReplaceAllStringFunc(text, func(s string) string {
		return "[REDACTED]"
	})
	fmt.Println(result)
	// → Contact [REDACTED] or [REDACTED]
}
CLI (grep / sed)
# Find lines matching an IP address pattern
grep -E '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' access.log

# Extract email addresses from a file
grep -oE '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' contacts.txt

# Replace dates from YYYY-MM-DD to DD/MM/YYYY using sed
echo "2026-03-30" | sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/'
# → 30/03/2026

# Count matches per file in a directory
grep -rcE 'TODO|FIXME|HACK' src/
# → src/main.js:3
# → src/utils.js:1

자주 묻는 질문

정규식과 글로브 패턴의 차이는 무엇인가요?
글로브 패턴(*.txt 또는 src/**/*.js 같은)은 셸과 빌드 도구에서 파일 경로 매칭에 사용되는 단순화된 와일드카드 문법입니다. *(임의의 문자), ?(한 문자), [](문자 클래스)를 지원하지만 수량자, 그룹, 전방 탐색, 교대(alternation)는 없습니다. 정규식은 훨씬 더 표현력이 풍부하며 파일 경로뿐만 아니라 임의의 텍스트에 동작합니다. 글로브 패턴 *.json은 정규식으로 ^.*\.json$에 대략 해당합니다.
정규식에서 리터럴 점이나 괄호를 어떻게 매칭하나요?
문자 앞에 백슬래시를 붙이세요: \. 는 리터럴 마침표, \[ 는 리터럴 괄호를 매칭합니다. 문자 클래스 [] 안에서 점은 이미 리터럴이므로 이스케이프가 필요 없습니다. 흔한 실수는 192.168.1.1을 점 이스케이프 없이 작성하는 것인데, 이 경우 .가 "임의의 문자"를 의미하므로 192x168y1z1도 매칭됩니다.
테스트 데이터가 서버로 전송되나요?
아닙니다. 이 도구는 JavaScript RegExp 엔진을 사용하여 브라우저에서 완전히 정규식 매칭을 실행합니다. 텍스트나 패턴으로 네트워크 요청이 이루어지지 않습니다. 도구를 사용하는 동안 브라우저 개발자 도구의 네트워크 탭을 열어 직접 확인할 수 있습니다.
JavaScript에서는 동작하던 정규식이 Python에서 왜 실패하나요?
JavaScript와 Python은 기능 세트가 약간 다른 정규식 엔진을 사용합니다. JavaScript는 \d, 전방 탐색 (?=), ES2018부터 후방 탐색 (?<=)을 지원하지만 조건부 패턴, 원자 그룹(atomic group), 소유 수량자(possessive quantifier)는 지원하지 않습니다. Python의 re 모듈은 \p{} 유니코드 속성 클래스를 지원하지 않습니다(대신 서드파티 regex 모듈을 사용하세요). 항상 대상 언어의 엔진에서 테스트하거나 해당 언어의 정규식 문서를 참고하세요.
정규식에서 치명적 백트래킹이 발생하는 원인은 무엇인가요?
치명적 백트래킹은 패턴에 지수적으로 많은 매칭 경로를 만드는 중첩된 수량자가 있을 때 발생합니다. 대표적인 예로, (a+)+ 패턴을 a 여러 개 뒤에 매칭되지 않는 문자가 오는 문자열에 적용하는 경우입니다. 엔진은 실패하기 전에 내부 그룹과 외부 그룹 사이에서 a를 분할하는 모든 가능한 방법을 시도합니다. 원자 그룹 (?>), 소유 수량자 a++을 사용하거나 모호한 반복을 피하도록 패턴을 재작성하여 해결하세요.
정규식으로 HTML을 파싱할 수 있나요?
정규식은 단일 <a> 태그에서 href를 추출하는 것처럼 HTML 조각에서 단순한 값을 추출할 수 있습니다. 완전한 HTML 파싱에는 적절한 파서를 사용하세요(JavaScript의 DOMParser, Python의 BeautifulSoup, Go의 html/template). HTML은 문맥 자유 문법이고 정규식은 정규 문법을 다룹니다. 중첩된 태그, 선택적 속성, 자기 닫힘 요소는 정규식으로 안정적으로 매칭할 수 없는 패턴을 만듭니다.
탐욕적 수량자와 게으른 수량자의 차이는 무엇인가요?
탐욕적 수량자(* 또는 +)는 가능한 한 많은 문자를 매칭한 후, 나머지 패턴이 실패하면 백트래킹합니다. 게으른 수량자(*? 또는 +?)는 가능한 한 적은 문자를 매칭하며, 필요할 때만 확장합니다. <b>one</b><b>two</b> 입력에서 탐욕적 패턴 <b>.*</b>는 첫 번째 <b>부터 마지막 </b>까지 전체 문자열을 매칭하는 반면, 게으른 패턴 <b>.*?</b>는 <b>one</b>과 <b>two</b>를 각각 따로 매칭합니다.