<쿼리>
SELECT name,hpage,
LTRIM(REGEXP_SUBSTR(hpage,'/([[:alnum:]]+\.?){3,4}?'),'/')
FROM professor
WHERE hpage IS NOT NULL;
<결과>
NAME HPAGE URL
--------------------------------------------------------------
Audie Murphy http://www.abc.net www.abc.net
Angela Bassett http://www.abc.net www.abc.net
Jessica Lange http://www.power.com www.power.com
Michelle Pfeiffer http://num1.naver.com num1.naver.com
----------------------------------------------------------------------
예제 연습으로 다음과 같은 쿼리를 분석하는중에
regexp_substr(hpage,'/([[:alnum:]]+\.?){3,4}?')
이 함수에 의문이 생겼습니다.
패턴 표현하는 부분인데요.
'/([[:alnum:]]+\.?){3,4}?'
여기서 \는 escape 문자로써 쓰이고 .(dot)을 위해 쓰인거지만 따로 기능이 없는지 없어도 잘 출력되더라구요.
그리고 물음표문자는 *와 같은 기능을 한다고 알고있는데...
굳이 저기서 \.? 와 {3,4}? 에 ?가 왜 쓰이는지 궁금합니다.
.로 구분되는 패턴필드를 3개에서 4개 까지 출력하라는 것인데... ?가 굳이 없어도 잘 되서 의문이 생겼습니다.
regexp_substr(hpage,'/([[:alnum:]]+.?){3,4}?')
regexp_substr(hpage,'/([[:alnum:]]+.){3,4}')
둘 다 같은 결과!
1. \ 는 정규식의 패턴 문자를 일반문자로 인식하게 합니다.
- . 은 모든 문자를 나타내지만 \. 은 그냥 문자 . 을 의미합니다.
- url 중간 중간 나타나는 . 을 표현하기 위해 \ 를 사용한거죠.
2. ? 는 있을 수도 있고 없을 수도 있다는 의미입니다.
- ? : 0 ~ 1 개
- * : 0 ~ n 개
- + : 1 ~ n 개
- {3,4} : 3 ~ 4 개
3. 전체 적인 느낌을 보면 적절한 사용법은 아닌 듯 합니다.
- \. 에 ? 를 붙인 것은 맨 마지막에는 . 이 없기 때문이죠.
- 하지만 이로 인해 앞에 . 이 붙은 것들도 이상하게 해석될 수 있습니다.
- ? 때문에 . 이 없어도 되므로 [[:alnum:]]+ 에서 + 의 갯수가 (1 ~ n) 이므로
- www. 를 하나의 묶음으로 볼수도 있고, w w w. 이렇게 3개로 볼수도 있죠.
- 이는 다음에 오는 {3,4} 에도 영향을 주게 됩니다.
- www. 뒤에 아무것도 없어도 w w w. 으로 해석된다면? {3,4}의 3번 반복을 만족하게 되죠.
- 요구사항이 명확하게 정해져 있다면? 좀 더 나은 방법을 모색해 보세요.