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’ 조건을 적절하게 정의하고 싶을 때 사용한다.
필요하다면 하위 표현식 안에 다른 하위 표현식을 중첩하기도 한다.
'프로그래밍 놀이터 > Tips' 카테고리의 다른 글
[도서 정리] 9. 전방탐색과 후방탐색 - 손에 잡히는 10분 정규 표현식 (0) | 2019.12.31 |
---|---|
[도서 정리] 8. 역참조 사용하기 - 손에 잡히는 10분 정규 표현식 (0) | 2019.12.30 |
[도서 정리] 6. 위치 찾기 - 손에 잡히는 10분 정규 표현식 (0) | 2019.12.28 |
[도서 정리] 5. 반복 찾기 - 손에 잡히는 10분 정규 표현식 (0) | 2019.12.27 |
[도서 정리] 4. 메타 문자 사용하기 - 손에 잡히는 10분 정규 표현식 (0) | 2019.12.26 |
댓글