본문 바로가기
프로그래밍 놀이터/Tips

[도서 정리] 7. 하위 표현식 사용하기 - 손에 잡히는 10분 정규 표현식

by 돼지왕 왕돼지 2019. 12. 29.
반응형

7. 하위 표현식 사용하기 - 손에 잡히는 10분 정규 표현식



* 하위 표현식 이해하기


-

   가 있을 때 regexp  {2,} 는 일치하지 않는다.

; 에 대해서만 2회 이상이기 떄문이다.





* 하위 표현식으로 묶기


-

하위 표현식은 큰 표현식 안에 속한 일부 표현식을 한 항목으로 다루도록 한데 묶은 것이다.

하위 표현식은 괄호 사이에 사용한다.



-

ip 주소를 검색하는 경우 아래와 같이 두가지 경우 모두 사용할 수 있다.


\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

(\d{1,3}\.){3}\d{1,3}



-

일부 사용자들은 가독성을 높이고자 표현식 일부를 하위 표현식으로 묶기도 하는데,

(\d{1,3}\.){3}\d{1,3} 대신 (\d{1,3}\.){3}(\d{1,3}) 를 사용하면..

규칙에 완벽히 맞으며 실제 정규식이 제대로 작동한다.

하지만 사용하는 정규식 구현에 따라 성능 문제가 발생할 수는 있다.





* 중첩된 하위 표현식


-

하위 표현식을 중첩해(nest) 쓰기도 한다.

사실 하위 표현식은 다른 하위 표현식을 중첩하고 그 하위 표현식은 또 다른 하위 표현식을 중첩하기도 한다.

중첩되는 능력 덕분에 하위 표현식은 매우 강력한 표현도 만들 수 있다.

하지만 반대로 표현식을 뒤엉키게 해 읽거나 분석하기 어렵고, 그 복잡한 모습에 겁을 먹게 만들기도 한다.

하지만 사실 복잡해 보이도록 중첩된 하위 표현식은 거의 사용되지 않는다.



-

(\d{1,3}\.){3}\d{1,3} 는 유효하지 않은 IP 주소도 검색한다.

유효한 값의 범위를 지정할 수 있으면 매우 좋겠지만, 정규 표현식은 문자를 일치시킬 뿐이지 문자가 의미하는 바에 대해서는 아무런 지식이 없다.

또 수학적 연산을 사용할 수도 없다.


IP 주소의 가능한 케이스에 대한 요구사항은 아래와 같다.

1. 모든 한 자리 혹은 두 자리 숫자

2. 1로 시작하는 모든 세 자리 숫자

3. 2로 시작하면서 두번째 자리 숫자가 0부터 4 사이인 모든 세 자리 숫자

4. 25로 시작하면서 세 번째 자리 숫자가 0부터 5 사이인 모든 세 자리 숫자


(((25[0-5]) | (2[0-4]\d) | (1\d{2}) | (\d{1,2}))\.){3}((25[0-5]) | (2[0-4]\d) | (1\d{2}) | (\d{1,2}))


이 조건에서 1~4번의 조건의 “논리적인” 순서는 의미가 없다.

그러나 정규식에서의 순서는 의미가 있다.


패턴이 왼쪽에서 오른쪽으로 평가되므로, 일치하는 식이 네 개 있다면, 첫번째 식을 시도하고, 두 번째 식을 시도하는 식으로 일치한다.

만약 패턴이 일치하면 다른 선택 사항은 시도되지 않는다.





* 요약


-

하위 표현식은 표현식에 있는 일부 표현식을 한데 묶을 때 사용하며, 괄호로 정의한다.

하위 표현식은 반복 메타 문자로, 정확히 반복하려는 패턴의 영역을 정하거나 ‘OR’ 조건을 적절하게 정의하고 싶을 때 사용한다.

필요하다면 하위 표현식 안에 다른 하위 표현식을 중첩하기도 한다.




반응형

댓글