무엇인가요\? 정규식은 무엇을 의미하나요?

무엇인가요\? 정규식은 무엇을 의미하나요?

7자리 전화번호를 검색하려면 다음 명령을 사용합니다.

grep "[[:digit:]]\{3\}[ -]\?[[:digit:]]\{4\}" file

\?무엇을 나타내는가?

답변1

다른 많은 정규식 엔진과 마찬가지로 ?"0 또는 이전 항목과 일치"를 의미합니다.

귀하의 예에서 \?는 에 적용됩니다 [ -]. 즉, 공백이나 빼기 기호와 일치하려고 시도하지만 공백이나 빼기 기호는 선택 사항입니다.

따라서 다음 중 하나라도 일치합니다.

555 1234
555-1234
5551234

이전 버전과의 호환성을 위해 작성된 \?것이 아닙니다 ?.

원래 버전은 grep"기본 정규식"이라는 다른 유형의 정규식을 사용했는데, 여기서는 ?문자 그대로 물음표만 표시되었습니다.

\?그들은 GNU grep이 0 또는 1개의 기능을 가질 수 있도록 이를 추가했지만, 사용된 스크립트가 ?여전히 예상대로 작동하도록 구문을 사용해야 했습니다 .

grep에는 -E"확장 정규식"이라는 보다 일반적인 유형의 정규식을 사용하도록 하는 옵션이 있습니다.

man 1 grep:

   -E, --extended-regexp
          Interpret PATTERN as an extended regular expression
          (ERE, see below).  (-E is specified by POSIX.)

   -G, --basic-regexp
          Interpret PATTERN as a basic regular expression (BRE, see below).
          This is the default.

...

Repetition
    A regular expression may be followed by one of several repetition operators:
    ?      The preceding item is optional and matched at most once.

...

    grep understands three different versions of regular expression syntax:
    “basic,” “extended” and “perl.”

...

Basic vs Extended Regular Expressions
    In basic regular expressions the meta-characters ?, +, {, |, (, and )
    lose their special meaning; instead use the backslashed versions
    \?, \+, \{, \|, \(, and \).

추가 정보:

답변2

불행하게도 정규식의 정확한 구문은 프로그램마다 약간씩 다릅니다. grep 정규식은 sed 정규식과 정확히 동일하지 않으며 Emacs 정규식과 정확히 동일하지 않으며 Emacs 정규식도 정확히 동일하지 않습니다. 이는 C++ 정규식과 정확히 동일하지 않습니다. 정규식은 정확히 동일하지 않습니다. 설상가상으로 grep과 같은 "표준" 도구도 Unix 계열 운영 체제마다 조금씩 다릅니다.

정규 표현식에서 일부 문자는 특별한 의미(예: 대괄호)를 가지며, 문자 앞에 백슬래시를 배치하여 "이스케이프"하면 리터럴 문자로서의 일반 의미로 되돌아갑니다(따라서 리터럴 괄호는 \[)로 쓰세요. 반대로 다른 것들은 이스케이프된 경우에만 특별한 의미를 갖습니다(예를 들어 일반 n은 문자일 뿐이지만 \n은 개행 문자입니다). 다시 말하지만 이는 정규식 구현에 따라 다를 수 있습니다.

대부분의 정규식 구현에서 물음표는 이전 항목이 선택 사항임을 의미하고 이스케이프된 물음표(\?)는 문자 그대로의 물음표를 의미합니다. 그러나 일부 방언에서는 그 반대가 사실입니다. 귀하의 예는 어느 쪽이든 의미가 있지만 어디에 방언이 있는 것 같나요? 리터럴이고 \?는 선택적 기호입니다. 따라서 정규식은 "3자리 숫자, 선택적으로 공백 또는 대시, 4자리 숫자"를 의미할 수 있습니다.

(또 다른 단서는 "이전 항목의 정확히 3개"를 의미하는 \{3\}과 같은 구문에서 볼 수 있습니다. 대부분의 정규식 방언에서 이는 {3} 로 작성되지만 \{는 문자 그대로 중괄호입니다.)

답변3

다음은 이미 다른 답변에 포함된 정보에 대한 간략한 요약입니다.

에서 는 grep문자 ?그대로의 물음표 문자와 일치하며 \?그 앞에 오는 내용이 0개 또는 1개 발생함을 나타냅니다. 따라서 질문의 예에서 [ -]\?공백이나 하이픈을 일치시키거나 아무것도 일치시키지 마십시오.

egrep또는 에서는 grep -E그 반대가 사실입니다. \?문자 그대로의 물음표와 일치한다는 것은 ?0개 또는 1개의 발생을 의미합니다.

이는 GNU grep에 적용됩니다. 비GNU grep 구현의 세부 사항은 약간 다를 수 있습니다. 특히 grep과(는 ) 역사적으로 두 개의 별도 프로그램이므로 오래된 프로그램에는 옵션이 egrep없다고 생각합니다 . POSIX에서는 이를 지정했지만 (놀랍게도) 언급하지 않았습니다 .grep-Egrep -Eegrep

관련 정보