질문.. 0 8 1,894

by 소는누가키워 [2011.06.10 15:01:26]


http://www.gurubee.net/article/47497
혼자서 실력때문에 창피해하며 열심히 하려고 하는 사람입니다.
위 문제를 풀려고 노력하다가 또? 모르겠어서 답을 봣는데요..
 REGEXP_REPLACE(REPLACE('.'||ip, '.', '.00'), '([^.]{3}(\.|$))|.', '\1') 
이게 핵심인듯 한데
'([^.]{3}(\.|$))|.'
도데체 이게 무슨말인가요?
정규식 구글링을 해도
뭔소린지 당췌 이해가 안가네요...
제가 이해하는데는
.부터 3번째 자리까지 매칭 인데
(\.|$))|. 부분은 도데체 몰르겠습니다.

알려주세요..

by 마농 [2011.06.10 15:20:37]
음. 정규식 처음 접하면 어려운게 당연합니다.
정규식에서 사용되는 각기호의 의미를 알아야 합니다.
각 기호들이 조합되었을때 어떻게 사용되는지를 알아야 합니다.
일단 해당 퀴즈 댓글 마지막 부분에 간략한 설명 달아 놓은것은 보셨는지요?

by 소는누가키워 [2011.06.10 15:33:56]

넵! 지금도 보고 있는데요.
REGEXP_REPLACE(REPLACE('.'||ip, '.', '.00'), '([^.]{3}(\.|$))|.', '\1') ip
1. 우선 .을 하나 붙이고 : '.'||ip
(10.100.10.1 ==> .10.100.10.1)
2. .을 .00으로 변경 : REPLACE('.'||ip, '.', '.00')
(.10.100.10.1 ==> .0010.00100.0010.001)
->무조건 .0010.00100.0010.001 형식으로 가는거 맞죠?
->REPACE 부분만 해보니
->REPLACE('.'||ip, '.', '.00')
->.0010.00100.0010.001
->.0010.00100.001.0010
->.00100.0010.001.0010
->.00100.0010.001.0020
->.002.0010.001.00140
3. 1번패턴(.이 아닌 문자열 3개 + (. or 끝)) or 2번패턴(기타모든 문자열) 을 첫번째 괄호에 해당하는 패턴으로 변경
바꿔 말하면 1번패턴은 놔두고 2번패턴은 삭제
REGEXP_REPLACE(REPLACE('.'||ip, '.', '.00'), '([^.]{3}(\.|$))|.', '\1')
->여기서 이해가 안가는게
->만약 .002.0010.001.00140 에서 첫번째 같은경우 .002 에서 002를 추출하는건 이해를 할것 같은데요..
->.0010 은 001 을 가져 오는거 아닌가요... 이해가 ㅠㅠ

by x [2011.06.10 15:57:02]
아니죠.
([^.]{3}(\.|$) --> \은 escape로 생각하시면 됩니다.
. 이나 마지막($)으로 끝나는 3개의 문자열을 가지고 오는거니까 001 이 아니고 010이 맞습니다.

by x [2011.06.10 15:58:00]
. 이나 마지막을 기준으로 뒤에서 3개를 읽어들입니다.

by 소는누가키워 [2011.06.10 16:21:40]
아.. 정규식 진짜 어렵네요..겨우 이해하는데;; 한시간 걸리네요
'([^.]{3}(\.|$))|.'
에서 맨 마지막 부분 |. 이부분 빼곤 모두 이해했습니다.;
마농님,x님 정말 감사 드립니다.

by 마농 [2011.06.10 16:21:46]
반대로 이해하셨네요
점으로 시작하는걸 찾는게 아니죠.
점으로 끝나는 3자리를 찾는 것입니다.
.0010.00100.0010.001 여기서는 다음 4가지가 1번 패턴이 되는거구요
010.
100.
010.
001$

그리고 위 패턴에 매치되지 않은 나머지 모든 문자
(.은 모든문자를 표현하죠) 이패턴이 2번패턴이 되는거죠

1번패턴과 2번패턴중 1번패턴만 유지하고 2번 패턴은 지우는거죠.

by 마농 [2011.06.10 16:27:19]
| 구분자를 기준으로 앞패턴과 뒤패턴이 OR 로 연결된다고 보시면 됩니다.
([^.]{3}(\.|$))|.
앞패턴은 .이 아닌 3자리 + ( . or $ )
뒤패턴은 . (모든문자)
대괄호 안의 . 은 실제 . 이구요
대괄호 안에 ^ 은 아닌거의 의미
대괄호밖의 . 은 모든문자
\. 은 .이 모든문자를 뜻하는게 아니라 실제 .을 뜻한다는 의미

by 소는누가키워 [2011.06.10 16:41:10]
헐.. 진짜 감사드립니다.!

문제 풀면서 어려우면 종종 질문 드리겠습니다;;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입