한국어

텍스트 및 일상 도구 · 텍스트 도구 키트

^ 및 $가 한 번만 일치하는 이유: 브라우저 찾기 및 바꾸기의 정규식 플래그

· 작동 방식

정규식 찾기 및 바꾸기 텍스트 정리

하나의 전체 텍스트 앵커와 반복되는 명시적인 개행 경계를 보여주는 여러 줄 목록
원본 ToolAcre 벡터 일러스트레이션

JavaScript 정규식 플래그(global, multiline 및 dotAll)에 대해 설명하고 찾기 및 바꾸기 상자가 여러 줄 앵커 ^ 및 $ 없이 전체 텍스트에 컴파일된 이유와 대신 작동하는 패턴을 설명합니다.

첫 번째 줄만 수정한 패턴 — ^가 '각 줄의 시작'을 의미할 것으로 예상하면 어떻게 되나요?

붙여넣은 목록에는 모든 행에 원치 않는 동일한 접두사가 포함될 수 있지만 `^prefix`을 검색하면 첫 번째 행에서만 제거됩니다. 놀라운 결과는 일관되지 않은 데이터가 아닌 패턴 구성에서 비롯됩니다. ToolAcre에서 `^`은 정규식이 여러 줄 모드 없이 컴파일되기 때문에 전체 텍스트의 시작을 식별합니다.

일치하는 `$` 앵커는 다른 쪽 가장자리에서도 동일한 규칙을 따릅니다. 이는 전체 텍스트의 끝을 식별하지만 내부에서 끝나는 모든 줄을 식별하지는 않습니다. 줄 바꿈은 입력의 일부로 유지되지만 다른 앵커 위치가 되지는 않습니다. 정리된 목록을 가져오기 전에 보고된 교체 횟수를 확인하세요. 1개를 세면 불일치가 즉시 드러납니다.

g 플래그 — '한 번의 패스로 모든 일치 항목 바꾸기'가 설정되는 전역 플래그에 따라 달라지는 이유

ToolAcre는 항상 전역 `g` 플래그를 사용하여 검색 패턴을 구성합니다. 이 선택은 JavaScript가 첫 번째 일치 항목 이후에 중지하는 대신 겹치지 않는 모든 일치 항목을 수집하도록 지시합니다. 도구는 먼저 `match`을 호출하여 개수를 결정한 다음 동일한 전역 패턴을 `replace`에 전달하므로 표시된 숫자와 대체 패스는 하나의 일치 규칙을 사용합니다.

글로벌 매칭은 패턴이 인식하지 못하는 위치를 생성할 수 없습니다. `^prefix`을 사용하면 적합한 전체 텍스트 시작이 하나만 있으므로 `g`은 여전히 ​​일치하는 항목을 하나 찾습니다. 여러 행에서 발생할 수 있는 패턴을 사용하면 `g`를 사용하여 모든 발생을 바꿀 수 있습니다. 디버깅할 때 이러한 질문을 분리하세요. 앵커는 일치가 시작될 수 있는 위치를 결정하고 전역 모드는 검색을 계속할지 여부를 결정합니다.

m 플래그 — 여러 줄이 ^ 및 $를 전체 텍스트 앵커에서 줄 앵커로 변경하는 방법과 이 도구가 이를 중단하는 이유

여러 줄 `m` 플래그는 `^` 및 `$`가 해석되는 방식을 변경하여 줄 종결자 주변의 위치와 외부 텍스트 경계를 인식할 수 있도록 합니다. ToolAcre는 해당 플래그를 추가하지 않습니다. 컴파일러는 대소문자 구분 검색에 `g`을 사용하고 추가 플래그에 대한 사용자 제어 없이 대소문자 구분이 지워진 경우 `gi`를 사용합니다.

여러 줄을 사용할 수 없게 두면 인터페이스가 작게 유지되지만 `gm`로 구성된 편집기에서 복사한 패턴이 여기에서 다르게 작동할 수 있음을 의미합니다. 친숙한 표현에 해당 플래그가 포함되어 있다고 가정하지 마십시오. RegExp가 생성될 때 JavaScript 플래그 문자가 제공되며 이 도구는 다른 모드를 자동으로 활성화하는 대신 지원되지 않는 인라인 플래그 구문을 거부합니다.

s 플래그 — 기본적으로 점이 개행 문자와 일치하지 않는 이유와 점 없이 줄 바꿈을 일치시키는 방법

컴파일러가 dotAll `s` 플래그도 생략하기 때문에 이 도구의 점은 줄 바꿈과 일치하지 않습니다. `BEGIN.*END`과 같은 패턴은 두 마커가 한 줄에 있을 때 일치할 수 있지만, 마커가 여러 행에 걸쳐 있으면 첫 번째 줄 바꿈에서 중지됩니다. 전역 모드를 추가해도 도트 자체가 소비할 수 있는 양은 변경되지 않습니다.

교차 라인 일치가 실제로 필요한 경우 허용되는 문자를 명시적으로 작성하십시오. `[\s\S]*?`와 같은 클래스는 공백과 공백이 아닌 공백을 포괄할 수 있지만 광범위한 패턴은 먼저 작은 샘플에서 테스트할 가치가 있습니다. 컴파일러는 잘못된 구문을 포착하지만 심각한 역추적 동작을 사용하는 값비싼 표현식으로부터 탭을 보호하지 않습니다.

개행을 명시적으로 일치 — 여러 줄을 사용할 수 없을 때 줄 시작과 끝을 대상으로 패턴에 \n 사용

여러 줄 모드 없이 반복되는 줄 시작의 경우 텍스트 시작 또는 개행 문자와 일치합니다: `(^|\n)prefix`. 첫 번째 대안은 첫 번째 행을 처리하고 두 번째 대안은 이전 줄 바꿈을 사용하여 이후 행을 처리합니다. 괄호는 일치하는 경계를 캡처하여 대체 항목에 선을 구분하는 구조를 유지하는 방법을 제공합니다.

이 기술은 패턴에서 줄 바꿈 구분 기호를 가정합니다. 텍스트 라이브러리는 전용선 작업 수행 시 CRLF, LF, Lone CR을 인식하지만 찾기 및 바꾸기는 원래 문자열을 직접 검색합니다. 붙여넣은 내용이 다른 줄 끝 형식을 사용하는 경우 먼저 이를 정규화하거나 의도적으로 표현을 조정하세요. 그렇지 않으면 이후 행이 화면에서 동일하게 보이더라도 그대로 유지될 수 있습니다.

(^|\n)을 사용하여 라인 경계를 명시적으로 일치시키고 캡처된 구분 기호를 유지합니다.

입력이 별도의 줄에 `ID: apple`, `ID: pear` 및 `ID: plum`라고 가정합니다. Regex를 활성화하고 `(^|\n)ID: `을 찾아 `$1`로 바꿉니다. 첫 번째 행에서 `$1`는 빈 시작 위치입니다. 이후 행에서는 캡처된 개행 문자입니다. 세 개의 행 경계가 모두 그대로 유지되는 동안 레이블은 사라집니다.

결과를 수락하기 전에 교체 횟수를 읽으십시오. 이 예에서는 3개의 행이 3개의 대체 항목을 생성해야 합니다. 개수가 1이면 작업을 반복하기보다는 실제 패턴과 줄 끝을 검사하세요. 교체 후 실행 취소가 가능하므로 동일한 표현식이 더 긴 가져오기 목록에 닿기 전에 작은 시도를 통해 일치와 재구성을 모두 확인할 수 있습니다.

여기서 다루지 않는 내용 — u, i 및 y 플래그 및 대체 항목에 개행 삽입(한 줄 필드로는 수행할 수 없음)

구현에서는 대소문자 구분이 꺼진 경우에도 `i`을 사용하지만 `u`, `y`, `m` 또는 `s`에 대한 컨트롤은 노출하지 않습니다. 이 문서에서는 예제에 필요한 누락된 여러 줄 및 dotAll 효과를 설명하는 것 외에 사용할 수 없는 모드에 동작을 할당하지 않습니다. 다른 JavaScript 환경의 패턴은 ToolAcre가 실제로 컴파일하는 플래그와 비교하여 검토되어야 합니다.

대체 텍스트가 JavaScript `String.replace`에 전달되므로 소스는 `$1`, `$&` 및 `$$`와 같은 대체 텍스트가 JavaScript 의미를 유지함을 증명합니다. 여기에 사용된 파일에서 렌더링된 필드가 제공하는 모든 상호 작용을 설정하지는 않습니다. 특히, 인터페이스를 통해 실제 줄 바꿈을 삽입하는 것은 개요만으로 추론하기보다는 테스트해야 합니다.

기타 플래그 및 교체 필드 동작은 이 도구 구현 외부에 있습니다.

인터페이스가 패턴 본문만 표시하는 경우에도 플래그를 정규식의 일부로 처리합니다. ToolAcre에서는 모든 검색이 전역적이며 선택적 대소문자 구분 모드는 `i`를 추가하고 multiline 및 dotAll은 없습니다. 이러한 사실은 `^`, `$` 및 점이 기본 전체 텍스트 및 한 줄 제약 조건을 유지하면서 일반 일치 항목에서 대체가 계속되는 이유를 설명합니다.

접두사가 붙은 붙여넣은 목록의 경우 `$1`이 포함된 `(^|\n)prefix`은 경계 이름을 지정하고 유지하므로 실용적인 해결 방법입니다. 대표 행부터 시작하여 개수를 확인하고 결과 라인 구조를 검사한 다음 전체 데이터세트를 처리합니다. 이 절차는 수수께끼 같은 일대일 결과를 가져오기 전에 검토 가능한 정리 단계로 바꿉니다.