정규식 테스터: 직접 작성한 텍스트로 패턴 구성 및 디버깅
정규식은 텍스트의 형태를 설명하는 작은 언어입니다. "이 정확한 단어가 여기 있나요?"라고 묻는 대신, "이렇게 생긴 문자열이 있나요?"라고 물을 수 있게 해줍니다. 코드 편집기, 로그 파일, 폼 입력, 스크립트에서 텍스트를 찾고, 검증하고, 추출하고, 치환하는 데 강력한 이유입니다. 머릿속에서는 완벽해 보이는 패턴이 너무 많이, 너무 적게, 또는 전혀 매칭되지 않을 수 있어서 실수하기도 쉽습니다.
바로 그래서 대화형 테스트가 추측보다 낫습니다. 패턴을 입력하고 실제 샘플 텍스트에서 매칭 항목이 강조되는 것을 보면, 즉각적인 피드백을 얻을 수 있습니다. 무엇이 잡혔는지, 무엇이 빠져나갔는지, 어떤 캡처 그룹이 어떤 부분을 가져갔는지 확인할 수 있습니다. 정규식 테스터는 브라우저 내에서 완전히 실행됩니다. 패턴과 샘플 텍스트는 페이지를 벗어나지 않으므로, 로그 라인, 이메일, 또는 프로덕션 데이터를 서버로 전송하지 않고 붙여넣을 수 있습니다.

알아두면 좋은 기본 구성 요소
대부분의 일상적인 패턴은 소수의 구성 요소로 조립됩니다. 이것들을 배우면 실제로 접하는 정규식 대부분을 읽을 수 있습니다.
문자 클래스는 허용되는 문자 집합을 설명합니다. [aeiou]는 단일 모음에 매칭되고, [0-9]는 숫자 하나에, [a-zA-Z]는 문자 하나에 매칭됩니다. 괄호 안의 캐럿은 집합을 부정하므로, [^0-9]는 "숫자가 아닌 문자"를 의미합니다. 단축어로 타이핑을 줄일 수 있습니다. \d는 숫자, \w는 단어 문자(문자, 숫자, 밑줄), \s는 공백, 그리고 점 .은 거의 모든 단일 문자에 매칭됩니다.
수량자는 앞의 구성 요소가 몇 번 반복될 수 있는지 지정합니다. *는 0회 이상, +는 1회 이상, ?는 0회 또는 1회(선택적)를 의미합니다. 정확한 횟수를 위해, {3}은 정확히 세 번, {2,4}는 두 번에서 네 번을 의미합니다. 따라서 \d{4}는 네 자리 연도에 매칭되고 colou?r는 두 가지 철자 모두에 매칭됩니다.
앵커는 문자가 아닌 위치에 패턴을 고정합니다. ^는 텍스트의 시작에, $는 끝에, \b는 단어 경계를 표시합니다. 패턴 ^Error는 "Error"로 시작하는 줄에만 매칭되며, 로그를 스캔할 때 원하는 것이 바로 그것입니다.
그룹은 패턴의 일부를 괄호로 묶어, 여러 문자에 수량자를 적용하고 나중에 재사용할 수 있도록 매칭된 텍스트를 캡처합니다. (\d{4})-(\d{2})-(\d{2})에서 각 그룹은 나중에 추출할 수 있는 날짜 구성 요소를 캡처합니다. 파이프를 사용한 교대는 "또는"처럼 작동합니다. cat|dog|fish는 세 단어 중 어느 하나에 매칭됩니다.
실제로 자주 사용하는 패턴들
몇 가지 반복되는 작업이 실제 업무의 대부분을 차지합니다. 이메일처럼 생긴 것을 찾으려면, [\w.+-]+@[\w-]+\.[\w.-]+가 실용적인 출발점입니다. 공식 사양에 따른 완전한 이메일 검증은 복잡하기로 유명하며, 사용자를 거부하기보다 후보를 강조하기 위해서는 느슨한 패턴이 보통 올바른 선택입니다.
숫자를 위해, \d+는 연속된 숫자를 가져오고, -?\d+(\.\d+)?는 선택적인 음수 기호와 소수점에 매칭됩니다. 앞뒤 공백을 제거하려면, ^\s+|\s+$를 매칭하여 빈 문자열로 교체합니다. 중복된 단어를 찾으려면, 역참조 패턴 \b(\w+)\s+\1\b가 자기 자신 뒤에 오는 단어에 매칭되며, 여기서 \1은 첫 번째 캡처 그룹을 다시 참조합니다.

매칭 동작을 바꾸는 플래그
플래그는 전체 패턴을 수정하는 스위치입니다. 전역 플래그(g)는 첫 번째에서 멈추지 않고 모든 매칭을 찾으며, 모든 발생을 강조할 때 원하는 것입니다. 대소문자 무시 플래그(i)는 error가 "Error"와 "ERROR" 모두에 매칭되게 합니다. 다중 행 플래그(m)는 ^와 $가 전체 텍스트의 시작과 끝이 아닌 모든 줄의 시작과 끝에 매칭되도록 바꾸며, 줄 단위 로그 작업에 필수적입니다. 유용한 다른 플래그로는 s(점이 줄 바꿈에 매칭되도록 하는 dotall)와 완전한 유니코드 처리를 위한 u가 있습니다.
언어별로 조금씩 다른 정규식 방언
정규식은 하나의 고정된 표준이 아니라 방언의 집합입니다. JavaScript, Python, PCRE(PHP), Java, .NET, Go, Rust는 위의 핵심 구문에는 동의하지만, 가장자리에서는 차이가 있습니다. 후방 탐색 지원, 명명된 그룹 구문((?<name>...) 대 (?P<name>...)), 유니코드 속성 이스케이프, 어떤 플래그가 있는지 등이 모두 다릅니다. 한 엔진에서 작동하는 패턴이 다른 엔진에서는 약간의 조정이 필요할 수 있으므로, 실제로 사용하는 방언에 맞게 테스트하는 것이 좋습니다. 패턴이 완성되면, 다른 개발자 도구와 텍스트 도구를 통해 방금 매칭한 데이터를 정리하고, 인코딩하고, 변환하는 주변 작업을 도움받을 수 있습니다.
자주 묻는 질문
텍스트가 서버로 전송되나요?
아니요. 정규식 테스터는 브라우저 내에서만 실행됩니다. 패턴과 샘플 텍스트는 기기에 머물며 절대 업로드되지 않으므로, 민감한 데이터를 붙여넣어도 안전합니다.
이 도구는 어떤 정규식 방언을 사용하나요?
브라우저에 내장된 JavaScript 정규식 엔진을 사용합니다. 핵심 구문은 대부분의 언어에서 알고 있는 것과 일치하지만, 일부 고급 기능은 PCRE, Python, .NET과 약간 다를 수 있습니다.
탐욕적 매칭과 게으른 매칭의 차이는 무엇인가요?
기본적으로 수량자는 탐욕적이어서 가능한 한 많은 텍스트를 가져갑니다. 물음표를 추가하면 게으르게 되어, 가능한 한 적은 텍스트를 가져갑니다. 예를 들어 점-별표 패턴은 탐욕적이고, 점-별표-물음표 패턴은 게으릅니다.
리터럴 특수 문자를 어떻게 매칭하나요?
백슬래시로 이스케이프하세요. 실제 점에 매칭하려면 백슬래시-점을 씁니다. 괄호, 대괄호, 더하기 기호, 물음표 같은 다른 메타 문자에도 동일하게 적용됩니다.
패턴이 아무것도 매칭하지 않는 이유는 무엇인가요?
일반적인 원인은 전역 플래그 누락, 잘못된 위치에 고정된 앵커, 이스케이프되지 않은 특수 문자, 또는 예상한 경계를 넘어서는 탐욕적 수량자입니다. 원인을 찾기 위해 조각별로 테스트하세요.
매칭의 일부를 캡처할 수 있나요?
예. 패턴의 한 섹션을 괄호로 묶어 캡처 그룹을 만드세요. 각 그룹은 별도로 보고되어, 날짜에서 연도, 월, 일 같은 필드를 추출할 수 있습니다.
