«정규표현식을 테스트한다»는 무슨 뜻인가요?
정규표현식 테스트 (« regex test online », « tester regex javascript »)는 실제 텍스트에 패턴을 실행해 엔진이 정확히 무엇을 돌려보내는지 관찰하는 것입니다 : 일치한 문자열, 그 위치, 캡처 그룹의 값. « 맞아 보이는 » 패턴은 당신의 데이터에서 돌아가기 전까지는 아무 말도 하지 않습니다 — 튜토리얼 속 정규표현식과 운영용 정규표현식을 가르는 유일한 차이가 바로 그것입니다.
테스트는 서로 다른 세 가지 질문에 답합니다. 일치하는가 : 일치 표가 곧바로 한 줄로 답해 줍니다. 어디에서, 몇 번 : 인덱스와 길이가 앵커가 제자리였는지 보여 줍니다. 무엇을 캡처하는가 : 번호 또는 이름 붙은 그룹이 뽑아내려던 부분을 제대로 뽑았는지 드러냅니다.
차이를 만드는 메타문자
점 . 개행을 제외한 모든 문자에 일치합니다. 그래서 여러 줄 텍스트에서는 플래그 s 없이는 안 됩니다. 한정자 *, + 그리고 ? 모두 탐욕적입니다 : 충분한 반복 횟수의 첫 번째에서 멈춥니다. 접미사 ? (*?, +?, {2,5}?)는 이 동작을 뒤집어 게으른 버전, 거의 항상 택해야 하는 경우는 .* 가 줄 끝을 삼키는 상황입니다.
대괄호는 클래스를 정의합니다 : [abc] 목록된 문자 중 하나를 받습니다, [^abc] 그 외 전부, [a-z0-9] 범위입니다. 클래스 처음의 부정에는 주의하세요 — [^...] 첫 위치에서만 유효하며, 그렇지 않으면 ^ 는 다시 리터럴이 됩니다. 파이프 | 는 대안을 나누고 낮은 우선순위로 동작합니다 : ^cat|dog$ 는 «전체 텍스트가 cat» 또는 «전체 텍스트가 dog»라는 뜻이지 «처음이나 끝에 cat 또는 dog»는 아닙니다 — 이때는 그룹으로 묶어야 합니다 : ^(?:cat|dog)$.
그룹, 전방 탐색과 후방 탐색
괄호는 캡처합니다. 그룹 1은 $1 는 치환 쪽, \1 는 패턴 쪽. 이름 지정 그룹은 $<nom> 그리고 \k<nom> — 세 그룹부터는 훨씬 읽기 쉽습니다. (?:...) 는 번호를 만들지 않고 묶습니다. 캡처가 아니라 구조만 필요할 때는 이쪽을 택하세요.
전방·후방 탐색(lookaround)은 소비하지 않고 검사합니다 : (?=...) 는 뒤따르는 것이 일치해야 하고, (?!...) 는 그것을 금지하며, (?<=...) 그리고 (?<!...) 는 앞선 내용에도 같은 검사를 합니다. 이렇게 하면 캡처에 포함시키지 않으면서 비밀번호에 특수문자를 강제할 수 있습니다 : ^(?=.*\d)(?=.*[A-Z]).{12,}$.
ReDoS : 정규표현식이 시간폭탄이 될 때
이 ReDoS (Regular Expression Denial of Service)는 백트래킹 에서 나옵니다 : 거의 규칙에 맞는 입력 앞에서 다음과 같은 패턴 (a+)+$ 은 «a»를 쪼개는 온갖 방법을 실패하기 전까지 탐색하고, 폭발 횟수는 기하급수적으로 늘어납니다. 두 가지 습관 : 현실적인 용량으로 패턴을 테스트하는 것 — 성능 탭이 대신 해 줍니다 — 그리고 크기 제한이 없는 외부 입력에는 검증할 수 없는 정규표현식을 절대 돌리지 않는 것입니다. 서버에서는 막힌 정규표현식이 타임아웃이 될 때까지 worker 전체를 멈춥니다.
JavaScript, PCRE, Python : 같은 기초, 약간의 차이
테스터는 브라우저의 네이티브 엔진인 ECMAScript를 사용합니다. 기본 구문 — 클래스, 한정자, 그룹, 전방 탐색, 플래그 g i m s u y 는 PCRE(PHP, Perl), Python에서는 re, Java, Go에서도 공통입니다. 차이는 주로 후방 탐색(한동안 JavaScript에 없었으나 지금은 지원), Unicode 속성, 그리고 (?i), 같은 인라인 플래그(PCRE 전용)에 있습니다. 따라서 한 언어의 패턴을 다른 언어로 옮기는 것은 디테일 조정일 뿐 — 창작이 아닙니다.
이런 분께 추천
프론트엔드·백엔드 개발자(폼 검증, 로그 파싱, 데이터 마이그레이션), 운영·DevOps(구성 필터, WAF 규칙), 테스터·분석가(열 추출, 형식 검증), 편집자·데이터 분석가(파일 정리), 학생(메타문자 이해), 그리고 정규표현식 테스터 가 필요한 사람 — 빠르고, 완전하며, 비밀이 지켜지는 — 보완으로는 JSON 포매터, 그리고URL 인코더/디코더, 그리고Base64 인코더/디코더 그리고 JWT 인코더/디코더.