sql REGEXP_SUBSTR 질문입니다 0 6 9,004

by 하나가라 정규표현식 REGEXP_SUBSTR Regular Expression [2012.05.10 19:29:55]



professor테이블에서 주소가있는 교수만 http://를 제거해서 출력하는 문제인데요

select name,
  ltrim(regexp_substr(hpage,'/([[:alnum:]]+\.?){3,4}?'),'/') "hpage"
from professor
where hpage is not null ;

입력하면 정상적으로 출력이 되긴하는데

왜 저렇게돼는 지를 모르겠네요..;;

저문장에서 [[:alnum]] 은 무엇이고 +는 왜나오고 ?는 왜 쓰는지좀 알려주세요..ㅠㅠ
by InsideCore [2012.05.11 08:34:30]

by 손님 [2012.05.11 08:34:59]

.(마침표)   ==>> 정규식 표현에 존재하는 모든 문자와 매칭(newline은 제외)
예) a.b (acb, axb 등)

_(밑줄기호) ==>> 단문자 와일드카드를 의미(where 절의 like사용시)
예) a_b

# 앵커(anchor) 연산자
^(캐럿) ==>> 라인이 시작
$(달러) ==>> 라인의 끝
예) ^a.b$ 는 acb, azb, aab, abb와 매칭된다.

# 반복연산자(Repetition Operator, Quantifier)
^a.*e$    ==>> a로 시작해서 e로 끝나는 문자열 매칭

* ==>> 이 메타문자는 임의의 메타문자(.)가 0번, 한번 또는 여러번 반복되는 조건에 매칭된다.
    예) select regexp_instr('app_store', '^a.*e$') from dual
   LIKE 연산자에서는 이와 동일한 연산자로 a%b를 지원한다.
   여기에서 %는 임의 문자가 0번, 한번 또는 여러번 반복되는 조건에 매칭된다.
()     ==>> 서브표현식 즉, 그룹으로 나타냄
   예) b(an)*a 는 ba, bana, banana, yourbananasplit 과 매칭
  select regexp_substr('ba', 'b(an)*a') a1
   , regexp_substr('banda', 'b(an)*a') a2
    , regexp_substr('yourbananasplit ', 'b(an)*a') a3
  from dual;
    ba ba banana
    즉, (an)* 의 표현은 an을 그룹으로 묶고 0회, 1회, 여러번 반복되는 조건에 매칭된다.
? ==>> 0회 또는 1회 매치
+ ==>> 1회 또는 그 이상 횟수로 매치
{m}    ==>> 정확히 m회 매치
{m,}   ==>> 최소한 m회 매치


# 사전정의된 POSIX 문자 클래스
[:alpha:] ==>> 알파벳 문자
[:lower:] ==>> 소문자 알파벳 문자
[:upper:] ==>> 대문자 알파벳 문자
[:digit:] ==>> 숫자
[:alnum:] ==>> 알파벳/숫자
[:space:] ==>> 출력되지 않는 공백문자(예: carriage return, newline, vertical tab, form feed등)
[:punct:] ==>> 구두점 기호
[:cntrl:] ==>> (출력되지 않는) 컨트롤 문자
[:print:] ==>> 출력 가능한 문자

 - POSIX 문자 클래스는 반드시 대괄호[]로 묶여져야 한다. 예를 들어 [[:lower:]] 는 소문자와 매치가 되며
   [[:lower:]]{5} 는 연속적으로 5회 소문자와 매치되어야 한다.
 - ^ab[cd]ef$ 는 문자열 abcef, abdef 와 매치된다. 여기에서 c또는 d 두개의 문자중 하나가 사용되어 있어야 한다.
   select regexp_substr('abcef', '^ab[cd]ef$') a1
    , regexp_substr('abdef', '^ab[cd]ef$') a2
   from dual;


# 대체 매칭 및 표현식의 그룹화
| ==>> 대체 문자를 구분(그룹핑 연산자 ()와 함께 사용하기도 함)
()     ==>> 반복연산자 또는 백레퍼런스를 위해 대체 유닛을 서브표현식으로 그룹화
[char]    ==>> |문자 리스트. 문자 리스트 내부에 위치하는 대부분의 메타문자는 일반 문자로 인식됨
   그 예외가 캐럿(^) 기호와 하이픈(-) 기호

 - [^[:digit:]] 의 경우 ^는 반대 조건을 의미함 즉, 숫자가 아닌 문자로 구성된 패턴과 매칭.
 - ^[[:digit:]] 의 경우 ^는 맨 앞을 의미함. 즉, 숫자로 시작하는 패턴과 매칭.
 - 하이픈(-)은 영역(range)를 의미함. 즉, [a-m]은 a와 m사이의 임의의 문자와 매칭
 - [-afg]의 경우처럼 하이픈이 문자리스트의 첫번째 문자로 사용된 경우에는 실제 하이픈을 의미함.
 - t(a|e|i)n 은 문자 t와 n사이에 오는 3개의 대체문자을 지정하고 있다.
   즉, tan, ten, tin 등의 문자열로 매치된다. 같은 표현식으로 t[aei]n으로 표현 가능하다.


by 마농 [2012.05.11 10:31:39]

정규식에 대해 공부하는 것도 좋겠지만...
꼭 필요할 때 사용해야죠.
위 구문은 왜 저렇게 작성했는지 의문이네요?
원하는 결과가 제대로 나오는지도 의문이네요.
단순 'http://' 를 없애는 거라면 그냥 Replace 하면 간단한데요.
REPLACE(hpage, 'http://')


by 손님 [2012.05.11 10:37:36]

아 나도 정규식 되는 버전 사용하고 싶네요.. ㅎㅎ..

by 손님 [2012.05.12 13:23:19]

댓글 달아주신분들 정말 감사합니다.ㅠㅠ


by 손님 [2012.05.12 13:35:13]
마농님// 원래 문제 자체가 홈페이지가 없는 교수는 안나오게하고
홈페이지가있는 교수는 http:// 를제거하고 출력하는게 문제여서
http://를 제거하려고 했던건데
마농님말씀대로해보니까
결과가도 똑같이나오네요 마농님 말씀대로 하면 푸는건 쉽지만
제가지금 REGEXP_SUBSTR을 공부하고있는 단계여서
REGEXP_SUBSTR를 사용하여 푸는 문제였습니다 ㅎ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입