왜 일부 정규 표현식 명령에 다양한 문자가있는 '\'의 반대 해석이 있습니까?


10

예를 들어 다음 명령을 사용하십시오.

find . -regex ".*\.\(cpp\|h\)"

디렉토리에있는 모든 .h 및 .cpp 파일이 있습니다. 마침표 문자 '.' 정규 표현식에서 일반적으로 "모든 문자"를 의미합니다. 실제 마침표 만 일치 시키려면 백 슬래시 문자 '\'를 사용하여 이스케이프해야합니다.

이 경우 특별한 의미를 가진 문자가 주어지면 실제 문자를 얻으려면 이스케이프해야합니다.

이제 괄호와 "또는"막대를 각각 문자 '(', ')'및 '|'로 가져갑니다. 이것들은 또한 정규 표현식을 그룹화하는데 사용되는 특별한 의미를 가지고 있습니다. 그러나 특별한 의미를 얻으려면 백 슬래시를 사용하여 문자를 이스케이프해야합니다! 백 슬래시가 없으면 문자는 실제 문자의 의미를 갖습니다.

왜 '.' '(', ')'및 '|'과 다르게 취급됩니까?

답변:


12

그 대답은 실제로 "그냥"입니다. 정규 표현식 구문에는 여러 가지가 있으며 비슷한 모양을 공유하지만 일반적으로 기본은 동일하지만 세부 사항이 다릅니다.

역사적으로 모든 도구에는 저자가 생각한대로 무엇이든 할 수있는 새로운 구현이있었습니다. 이스케이프를 사용하거나 사용하지 않고 특수 문자를 만드는 것 사이에는 균형이 있습니다. "자연적으로 특수한"문자가 너무 많으면 해당 문자를 맞추기 위해 항상 이스케이프 처리해야합니다. 또는 다른 방법으로, () 그룹화와 같은 일반적인 정규식 구문을 사용하려면 많은 이스케이프가 필요합니다. 그리고 프로그램을 작성하는 모든 사람들은 프로그램과 일치하는 요구 사항, 올바른 접근 방식, 달의 위상에 따라 프로그램을 수행하는 방법을 결정했습니다.

" 기본 정규 표현식 "및 " 확장 정규 표현식 " 을 정의하는 POSIX 표준화 시도가있었습니다 . 놀랍,에 관해서 서로 이러한 작업 이전 버전 \- 가끔 있지만 완벽한 일관성.

펄 정규 표현식은 두 가지 이유로 사실상의 또 다른 표준이되었습니다. 첫째, 매우 유연하고 강력합니다. 둘째, "\는 항상 영숫자가 아닌 문자를 이스케이프합니다"와 같은 규칙을 사용하여 실제로 제정신 입니다.

GNU Find에는 -regextype사용 된 정규식 구문을 변경할 수 있는 옵션이 있습니다. 안타깝게도 "perl"은 적어도 내가 찾은 find 버전에서 옵션이 아닙니다. (기본값은 놀랍지 않게 GNU "emacs"이며 구문은 여기문서화되어 있습니다 .)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.