^ 의 완전 다른 두 의미
Caret 은 컨텍스트 따라 두 의미. 모두가 한 번씩 걸려 넘어짐.
- Character class 밖:
^는 start-of-string 앵커. - Character class 안, 첫 글자로:
^가 클래스 negate. - Character class 안, 첫 글자가 아니면:
^는 리터럴.
그래서 ^[abc] 는 "문자열 시작, 그 다음 a/b/c."
그리고 [^abc] 는 "a/b/c 가 아닌 어떤 글자든."
그리고 [a^b] 는 "a, 리터럴 caret, 또는 b."
이게 만드는 버그 종류
가장 흔한 버그: [^abc] 의도한 자리에 ^[abc] 작성. 첫 번째는 "문자열 시작에서 a/b/c" — 한 글자만 매칭. 두 번째는 "a/b/c 제외 어떤 글자든" — 어디든.
패턴이 잘못 동작하는 거 디버그할 때 모든 ^ 를 보고 묻기: "대괄호 안인가 밖인가? 첫 위치인가?"
$ 도 같지만 덜 헷갈림
$ 는 한 의미 (line/string 끝) 만. Character class 안에서 절대 특수 안 함. [a$b] 는 그냥 "a, 달러 기호, b." 놀랄 거 없음.