- Python
re의$는 멀티라인 모드가 꺼져 있어도 문자열 끝뿐 아니라 끝에 있는 마지막 개행 앞에도 매치될 수 있음 ^가 “문자열 시작”처럼 보인다고 해서$도 완전히 대칭적으로 동작한다고 보면 안 되며, 실제 의미는 정규 표현식 구현별로 달라짐"cat\n"에 대한$,\z,\Z의 결과는 PHP, ECMAScript, Python, Go, Java 8,.NET 7.0, Rust에서 서로 다르고, Python의\z는 Python 3.14에서 새로 추가됨- 끝의 개행까지 허용한다면 멀티라인 모드의
$가 표의 모든 플랫폼에서"cat\n"에 매치되지만, 개행을 제외한 끝만 매치하려면 문법 선택이 달라짐 - 마지막 개행을 매치하지 않아야 한다면 대부분의 플랫폼에서는
\z를 쓰고, Python 3.14 이전과 ECMAScript에서는 각각 다른 대안을 고려해야 함
Python re에서 $가 매치하는 위치
- Python 정규 표현식 모듈
re에서$는 멀티라인 모드가 꺼져 있어도 문자열 끝 또는 문자열 끝의 마지막 개행 바로 앞에 매치될 수 있음 cat$는"lolcat"에는 매치되고"internet cat video"에는 매치되지 않아 단순해 보이지만,"cat\n"처럼 끝에 개행이 있으면 예상과 달라질 수 있음re.MULTILINE이 지정되면$는 문자열 끝과 각 줄 끝, 즉 각 개행 바로 앞에 매치됨- 기본값에서도
$는 문자열 끝에 매치되며, 문자열 끝에 개행이 있다면 그 개행 바로 앞에도 매치됨
마지막 개행을 제외하고 매치하기
- 문자열 끝만 엄격히 매치하려면
$만으로는 부족할 수 있고,\z와\Z가 끝 앵커 후보가 됨 - Python 정규 표현식 문서와 다른 정규 표현식 문법 설명을 기준으로 보면, 구현별로
\z와\Z의 지원 여부와 의미가 다름 "cat\n"에 대한 차이는 다음과 같음- PHP:
"cat$"는 멀티라인 여부와 관계없이 매치되고,"cat\z"는 매치되지 않으며,"cat\Z"는 매치됨 - ECMAScript: 멀티라인
"cat$"는 매치되고, 멀티라인이 아닌"cat$"는 매치되지 않으며,\z와\Z는 지원되지 않음 - Python:
"cat$"는 멀티라인 여부와 관계없이 매치되고,"cat\z"와"cat\Z"는"cat\n"에 매치되지 않음 - Go와 Rust: 멀티라인
"cat$"는 매치되고, 멀티라인이 아닌"cat$"와"cat\z"는 매치되지 않으며,\Z는 지원되지 않음 - Java 8과 .NET 7.0:
"cat$"는 멀티라인 여부와 관계없이 매치되고,"cat\z"는 매치되지 않으며,"cat\Z"는 매치됨
- PHP:
- Python의
\z는 Python 3.14에서 새로 추가됐으며, 이전 버전에서는 지원되지 않았음 - 끝의 개행을 허용한다면 멀티라인 모드의
$는 표의 모든 플랫폼에서 일관되게"cat\n"에 매치됨 - 끝의 개행을 매치하지 않으려면 대부분의 플랫폼에서는
\z를 쓰고, Python 3.14 이전에는\Z, ECMAScript에서는 멀티라인이 아닌$를 써야 함 - 표의 데이터는 regex101.com에서 수집됐고, 실제 런타임으로 테스트한 것은 아님