REGEXP_SUBSTR 질문 좀 드릴께요 2 5 1,527

by 몽키매직 [SQL Query] REGEXP_SUBSTR [2018.06.12 14:59:24]


WITH T AS (

 SELECT '대전, 부산, 강원도(강릉시, 속초시, 동해시), 광주, 경상남도(김해시, 창원시), 경상북도(경주시, 포항시, 영덕군)' AS AREA FROM DUAL

이런식의 데이터가 있을경우 

대전  
부산  
강원도 강릉시, 속초시, 동해시
경상남도 김해시, 창원시
경상북도 경주시, 포항시, 영덕군

원하는 결과물은 이렇습니다. 

콤마로는 짤리는데 가로안에 있는것 까지 전부 짤리네요. 예상하기로는 한번에 안되고 한번 짤라서(대전,부산,강원,경남,경북) 다시 한번 가로안에 있는것들을 짤라야 할것같은데

좀 힘드네요.. 

힌트나 좀 부탁드립니다.

by 마농 [2018.06.12 16:08:24]
SELECT area
     , lv
     , REGEXP_SUBSTR(area, '[^,( ]+(\([^)]+\))?', 1, lv) x
  FROM t
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 9)
 WHERE lv <= REGEXP_COUNT(area, '[^,( ]+(\([^)]+\))?')
;

 


by 몽키매직 [2018.06.12 17:00:21]

감사합니다.

혹시 '경상북도(경주시, 포항시, 영덕군)' 에서 '경주시, 포항시, 영덕군' 만 빼오려면 replace랑 substr중 어떤걸 써야할까요?

substr(area, instr(area, '('), instr.. ) 이런식으로 하려고 했는데 뒤에 괄호위치가 전부 틀리네요.. trim을 줘도


by 마농 [2018.06.12 17:18:00]
SELECT lv
     , x
     , REGEXP_SUBSTR(x, '[^(]+') v1
     , REGEXP_REPLACE(x, '[^,( ]+(\(([^)]+)\))?', '\2') v2
  FROM (SELECT lv
             , REGEXP_SUBSTR(area, '[^,( ]+(\([^)]+\))?', 1, lv) x
          FROM t
             , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 9)
         WHERE lv <= REGEXP_COUNT(area, '[^,( ]+(\([^)]+\))?')
        )
;

 


by 몽키매직 [2018.06.12 18:26:45]

우어..이건.. 매칭 패턴을 보면서 보고있는데도 이해가 안되네요 ㅜㅜ

패턴은 그렇다 치고 뒤에 \2는 뭔가요? ^^;


by 마농 [2018.06.13 15:44:50]

1. 대괄호는 패턴문자를 표현합니다.
  - a-z 은 그냥 문자이지만
  - [a-z] 은 a 부터 z 까지의 문자를 의미합니다.
2. 소괄호는 묶음 단위를 표현합니다.
  - ((aa)(bb)) 이렇게 괄호가 3개가 있을 때
  - \1 은 첫번째 괄호를 의미합니다. aabb
  - \2 은 두번째 괄호를 의미합니다. aa
  - \3 은 세번째 괄호를 의미합니다. bb
3. ^ 는
  - 대괄호 밖에서는 문장의 시작을 의미합니다.
  - 대괄호 안에서는 부정(아니다)을 의미합니다.
  - ^a 는 맨 앞 a로 시작하는 것을 의미
  - [^a] 는 a가 아닌 문자를 의미
4. 문자의 반복 (+ * ? {1,2})
  - (a)+ 는 a가 1개이상
  - (a)* 는 a가 0개이상
  - (a)? 는 a가 0개 또는 1개
  - (a){2}  는 a가 2개
  - (a){2,} 는 a가 2개 이상
  - (a){,2} 는 a가 2개 이하
  - (a){2,4} 는 a가 2~4개
  - (.){3} 아무문자(.)나 3개
5. \ (역슬래쉬)은
  - 특수기능을 하는 문자(위에 예를 들 문자)의 기능을 제거하여 일반 문자화 시킴
  -  . 은 아무 문자를 뜻하지만
  - \. 은 쩜을 뜻함

작성한 정규식을 해석해 보면
'[^,( ]+(\(([^)]+)\))?' 은 크게 두가지 묶음으로 나뉩니다.
1. [^,( ]+
2. (\(([^)]+)\))?
1번은 (컴마|괄호열기|공백)등이 아닌 문자가 여러개 반복 = 괄호시작 전 문자
2번은 (괄호열기 + (괄호닫기 아닌문자 여러개) + 괄호닫기) 가 0개 또는 1개 = 괄호 이후 문자
여기서 \2 는 두번째 괄호 (괄호닫기 아닌문자 여러개) 를 의미

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