기능 소개
PCRE 정규식 테스터는 PHP, Perl 계열 도구, 여러 웹 서버가 쓰는 엔진인 실제 PCRE2 라이브러리로 텍스트에 정규 표현식을 적용해 봅니다. 매치는 하이라이트되고, 각 매치의 위치와 캡처 그룹이 목록으로 표시되며, 치환 문자열을 넣으면 preg_replace 방식의 치환 결과도 보여 줍니다.
실제 엔진으로 테스트하는 것이 중요한 이유는 PCRE와 JavaScript 정규 표현식이 작지만 중요한 부분에서 다르기 때문입니다. 브라우저 기반 테스터에서 잘 되던 패턴이 PHP에서는 컴파일되지 않거나 다른 결과와 매치될 수 있습니다.
사용 방법
- PCRE 패턴에 구분자 없이 패턴을 입력합니다.
- 검색할 텍스트를 테스트 문자열에 붙여 넣습니다.
- 필요한 수정자를 켭니다. 모든 매치(preg_match_all과 같음)는 g, 그리고 i, m, s, x, U, 유니코드를 인식하는
\w,\d,\b는 u입니다. - 치환 결과를 미리 보려면 치환 문자열을 채웁니다. 번호 그룹은
$1또는${1}, 이름 있는 그룹은${name}, 전체 매치는$0을 씁니다.
잘못된 패턴이면 PCRE2 자체의 오류 메시지와 함께 패턴에서 해석이 멈춘 위치를 보여 줍니다.
예시
기본 패턴 \((?:[^()]++|(?R))*\)는 짝이 맞는 괄호를 찾습니다. 괄호가 아닌 문자, 또는 재귀적으로 패턴 전체를 다시 담은 한 쌍의 괄호와 매치됩니다. 예시 텍스트에서는 (a, g(b, c))와 ((x), y)를 찾고 끝의 닫히지 않은 괄호는 무시합니다. JavaScript 정규 표현식으로는 이런 표현이 불가능합니다.
(?<amount>\d+(?:\.\d+)?)\s+(?<cur>USD|EUR)에 치환 문자열 ${cur} $1을 넣어 보세요. 두 번째 줄의 금액과 통화 코드 순서가 바뀝니다.
알아 두면 좋은 PCRE 기능
- 소유 수량자(
*+,++,?+)와 원자 그룹((?>...))은 한 번 매치한 내용을 되돌려 주지 않으므로 폭주하는 백트래킹을 막아 줍니다. \K— 매치 시작 위치를 재설정합니다. 후방 탐색(lookbehind)의 간단한 대안입니다.(?R),(?1),(?&name)을 쓰는 재귀로 중첩 구조를 매치할 수 있습니다.(?i)같은 인라인 수정자는 패턴 일부의 동작만 바꿉니다.
팁
- PHP에서는 패턴을
/.../나~...~같은 구분자로 감싸는데, 패턴 안에 나오지 않는 문자를 고르면 이스케이프할 필요가 없습니다. - 텍스트에 악센트가 붙은 글자나 한중일 문자가 있다면
\w가 이를 매치하도록 u를 켜세요.
자주 묻는 질문
› JavaScript 정규식 테스터와 무엇이 다른가요?
이 페이지는 PHP의 preg_ 함수, Nginx, Apache 등 많은 도구가 쓰는 엔진인 PCRE2를 WebAssembly로 컴파일해 실행합니다. (?R) 재귀, a++ 같은 소유 수량자, 원자 그룹, \K, (?P<name>...) 그룹, x와 U 수정자처럼 JavaScript에 없는 문법을 지원합니다.
› /pattern/i처럼 구분자도 입력해야 하나요?
아니요. 패턴만 입력하고 수정자는 체크박스로 켭니다. PHP의 `preg_match('/\d+/i', $s)`는 패턴 `\d+`에 대소문자 무시를 켠 것과 같습니다.
› "match limit exceeded"가 나오는 이유는 무엇인가요?
일치하지 않는 긴 문자열에 ^(a+)+$를 쓰는 경우처럼, 어떤 패턴은 지수적으로 많은 백트래킹을 일으킵니다. 페이지가 멈추지 않도록 테스터는 500만 단계 후에 중단합니다. PHP에도 pcre.backtrack_limit라는 비슷한 안전장치가 있어, 한도에 걸리면 preg_match가 false를 반환합니다.
› 입력한 텍스트가 업로드되나요?
아니요. PCRE2 WebAssembly 모듈을 한 번 내려받은 뒤에는 모든 처리가 브라우저에서 이루어집니다.