문서 작업 가이드
raw 패턴과 문자열 사이의 JavaScript 정규식 이스케이프 고치기
백슬래시와 리터럴 메타 문자를 테스트하기 전에 raw RegExp 본문, 슬래시 리터럴, JavaScript 문자열, JSON 값, 복사 텍스트를 구분합니다.
작성 및 검수 SimpleWebUtils게시일: 검토일:
이 작업 흐름을 검증한 방법
Worker Timeout과 캡처 범위를 제공하는 JavaScript 정규식 테스터로 “JavaScript 소스 문자열의 공백 패턴을 테스터로 옮기기” 샘플 입력을 정확히 재현했습니다. 결과 비교에는 “의도한 대상 텍스트 작성”, “표현 층 하나만 디코딩” 단계를 포함했습니다. 이어서 연결된 테스트 근거에서 “/pattern/flags를 패턴 본문에 붙여넣기”, “점과 더하기가 연산자임을 잊기” 조건을 점검했습니다.
raw 패턴 ^ERROR\s+(.+)$는 전체 일치 1개와 “Timeout after 30s” 캡처를 만들었으며, 소스 문자열의 이중 escape를 그대로 둔 패턴은 같은 텍스트와 일치하지 않았습니다.
문제 상황
논리적으로 같은 토큰도 raw 패턴에서는 \s, RegExp 리터럴에서는 /\s/, JavaScript 소스 문자열에서는 '\\s', 직렬화된 JSON에서는 "\\s"처럼 보일 수 있습니다. 현재 표현 층을 모른 채 복사하면 백슬래시 자체를 찾거나 필요한 백슬래시를 잃고, 리터럴 구두점이 연산자로 바뀝니다. 표현 디코딩과 정규식 의미를 분리한 뒤 대상 형식에 정확히 한 번만 다시 인코딩해야 합니다.
이럴 때 사용하세요
- JavaScript나 JSON에서 복사한 패턴에 백슬래시가 두 개 또는 네 개씩 보일 때
- 리터럴 점·괄호·대괄호·더하기·슬래시·백슬래시가 정규식 문법으로 동작할 때
- /pattern/flags 예제를 패턴 본문만 받는 입력란에 붙여넣었을 때
- 테스터에서는 동작하지만 코드·JSON·YAML·환경 변수에 저장하면 실패할 때
- 치환·추출에 사용하기 전 검토된 raw 패턴이 필요할 때
단계
- 1단계
현재 표현 형식 이름 붙이기
출처를 raw 패턴 본문, RegExp 리터럴, JavaScript 문자열 리터럴, 파싱된 런타임 문자열, JSON 소스 값, 셸 인수, 문서 렌더링 중 하나로 표시합니다. 이 층을 알기 전에는 백슬래시를 바꾸지 않습니다.
- 2단계
의도한 대상 텍스트 작성
반드시 일치해야 할 텍스트와 일치하면 안 되는 텍스트를 구체적으로 적습니다. 점, 대괄호, 괄호, 슬래시, 더하기, 공백 중 어느 것이 리터럴이고 어느 것이 정규식 연산자인지 표시합니다.
- 3단계
표현 층 하나만 디코딩
따옴표 JavaScript·JSON 값은 문자열 이스케이프/해제 도구나 실제 파서로 파싱된 런타임 문자열을 확인합니다. RegExp 리터럴은 테스터에 넣기 전에 슬래시 구분자와 뒤 플래그를 분리하고 이미 raw인 본문을 반복 해제하지 않습니다.
- 4단계
최소 raw 패턴 본문 구성
문법상 필요한 곳에만 정규식 이스케이프 하나를 사용합니다. 리터럴 점은 \., 여는 대괄호는 \[, 공백 토큰은 \s, 리터럴 백슬래시는 \\입니다. 플래그는 본문 뒤에 붙이지 말고 별도 컨트롤에서 고릅니다.
- 5단계
허용·거부·경계 입력 테스트
raw 본문을 정확한 대상, near-miss, 빈 값, 구두점, Unicode, 긴 실패 입력에 실행합니다. 일치 개수가 1 이상이라는 이유만으로 통과시키지 말고 전체 일치와 캡처 범위를 확인합니다.
- 6단계
대상 형식에 한 번만 인코딩
raw 본문 검증 후 RegExp 리터럴로 만들거나 new RegExp()에 전달하고, 바깥 JavaScript 문자열·JSON·셸·설정 형식이 요구하는 이스케이프를 정확히 한 번 적용합니다.
- 7단계
파싱된 런타임 패턴 재검증
안전한 fixture에서 RegExp.source와 flags를 확인해 검토한 raw 본문과 비교합니다. 폐기 가능한 샘플로 실제 치환·추출을 실행하고 fixture와 로그에는 비밀값과 개인정보를 넣지 않습니다.
예시
JavaScript 소스 문자열의 공백 패턴을 테스터로 옮기기
입력
JavaScript 소스 문자열: "^ERROR\\s+(.+)$"
파싱된 런타임 문자열: ^ERROR\s+(.+)$
테스트 텍스트: ERROR Timeout after 30s출력
테스터 본문은 슬래시 없이 ^ERROR\s+(.+)$입니다. 전체 일치 1개와 $1 = Timeout after 30s를 반환합니다. JavaScript 소스 문자열로 되돌릴 때 검증된 백슬래시를 바깥 문자열 층에서 한 번 더 인코딩합니다.흔한 실수
소스 문자열 이스케이프를 raw 테스터에 유지하기
소스 문자열에는 언어 파서용 백슬래시가 더 필요할 수 있습니다. 테스터는 패턴 본문을 직접 받으므로 바깥 이스케이프까지 가져오면 RegExp가 보는 내용이 바뀝니다.
/pattern/flags를 패턴 본문에 붙여넣기
슬래시 구분자는 JavaScript 리터럴 문법이며 RegExp.source의 일부가 아닙니다. 본문과 플래그를 별도 입력에 나눠 넣으세요.
점과 더하기가 연산자임을 잊기
실제 마침표는 \., 실제 더하기는 \+로 찾습니다. wildcard나 반복 의미가 의도된 경우에만 이스케이프하지 않습니다.
모든 구두점을 자동 이스케이프하기
불필요한 이스케이프는 의도를 흐리고 일부 identity escape는 u에서 다르게 동작합니다. 기호가 낯설어서가 아니라 문법 규칙과 대상 텍스트를 근거로 이스케이프하세요.
허용 샘플 하나에서 멈추기
원하는 샘플에 일치하면서 무관한 텍스트도 허용할 수 있습니다. 거부·경계 fixture와 캡처를 확인하고 대상 형식 인코딩 후 런타임 source를 다시 검증하세요.
자주 묻는 질문
JavaScript 소스에서 \s가 \\s로 보이는 이유는 무엇인가요?
RegExp가 값을 받기 전에 JavaScript 문자열 파서가 이스케이프 한 층을 소비하기 때문입니다. 소스 문자열의 백슬래시 두 개가 런타임 패턴 본문의 백슬래시 하나를 만들 수 있습니다.
테스터에 슬래시 구분자를 입력해야 하나요?
아니요. 슬래시 사이 본문만 입력하고 g, i, m, s, u, y는 별도 컨트롤에서 선택하세요. 슬래시는 RegExp.source가 아니라 JavaScript RegExp 리터럴 문법입니다.
리터럴 백슬래시는 어떻게 일치시키나요?
raw 정규식 본문에서는 백슬래시 하나를 찾기 위해 \\가 필요합니다. JavaScript·JSON 소스 문자열에는 바깥 이스케이프가 한 층 더 필요하므로 눈으로 세지 말고 파싱된 런타임 문자열을 확인하세요.
점은 언제 이스케이프해야 하나요?
파일 확장자나 호스트명처럼 실제 마침표가 필요하면 \.를 사용합니다. 임의의 문자 하나가 의도된 경우에만 점을 그대로 두고 s의 줄바꿈 포함 여부는 따로 결정하세요.
문자열 이스케이프/해제 도구가 올바른 정규식을 결정해 주나요?
문자열 표현 층은 보여 줄 수 있지만 정규식 의미는 결정하지 못합니다. 정확한 허용·거부 텍스트, 플래그, 캡처 검토, 대상 런타임 테스트가 여전히 필요합니다.
코드로 옮긴 뒤 무엇을 비교해야 하나요?
생성된 RegExp.source와 flags를 검토한 본문·컨트롤과 비교하고, 같은 허용·거부·Unicode·경계·긴 near-match fixture를 대상 런타임에서 실행하세요.