확장된 정규식 설명

확장된 정규식 설명

이것은 "Linux Command Line" 책의 예입니다.

(555) 123-4567 또는 555 123-4567을 일치시키려고 하면 다음 확장 정규식을 사용할 수 있습니다.

^\(?[0-9][0-9][0-9]\)?  [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$

단순화

^\(?[0-9]{3}\)?  [0-9]{3}-[0-9]{4}$

첫 번째 예에서는 두 번째 예가 ?에 포함된 전체 표현식에 적용됩니까? 즉 , 또는 ()와 일치한다는 의미입니다 .555(555)

두 번째 예에서는 다음과 같습니다.

echo "This works." | grep -E '[[:upper:]][[:upper:][:lower:] ]*\.'

별표는 *전체 표현식에 적용됩니까, 아니면 상위 및 하위 문자 클래스를 포함하는 표현식의 두 번째 부분에만 적용됩니까?

이전 표현식이 다음과 같은 경우:

grep -E '[[:upper:][:upper:]][:lower:]*\.'

*하위 캐릭터 클래스에만 적용 되나요 ?

답변1

Theophrastus 및 Steeldriver의 의견 요약(이 답변을 자유롭게 편집할 수 있음) 및 일부 의견:

첫 번째 예에서는 두 번째 예는 어떻습니까? ()에 포함된 전체 표현식에 적용됩니까? 즉, 555 또는 (555)와 일치합니다.

두 번째는 ?닫기(이스케이프)에 적용되고 )첫 번째는 ?열기(이스케이프)에 적용됩니다 (. 두 경우 모두 리터럴 문자와 일치합니다. 또한 정규 표현식 뒤에는 공백 문자 하나가 아닌 두 개의 공백 문자가 있으므로 ?예제 입력과 일치하도록 공백을 제거해야 합니다.

정규식은 다음과 일치합니다(공백 문자 하나 제거).

(555) 123-4567
(555 123-4567
555) 123-4567
555 123-4567

그룹을 일치시키려면 확장 정규 표현식에서 괄호를 이스케이프 처리하지 마세요.

555예제 및 선택적 그룹에서 다음 공백 과 일치합니다 .

$ echo -e "555 123-4567\n123-4567" | grep -E '^([0-9]{3} )?[0-9]{3}-[0-9]{4}$'
555 123-4567
123-4567

* 별표는 전체 표현식에 적용됩니까, 아니면 상위 및 하위 문자 클래스를 포함하는 표현식의 두 번째 부분에만 적용됩니까?

예, 대괄호 표현식에서만 작동합니다 [[:upper:][:lower:] ].

grep -E '[[:upper:][:upper:]][:lower:]*\.'

* 하위 캐릭터 클래스에서만 작동하나요?

네, 철자 오류가 없다면 가능합니다. 낮은 문자 클래스의 경우 두 개의 대괄호가 필요하지만 이는 [[:upper:][:upper:]]의미가 없습니다. 하나면 [[:upper:]]충분합니다.

그렇게 될 것이다

grep -E '[[:upper:]][[:lower:]]*\.'

관련 정보