이것은 "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:]]*\.'