행위

오라클 정규식

DB CAFE

Dbcafe (토론 | 기여)님의 2022년 1월 12일 (수) 08:07 판 (REGEXP_REPLACE)
thumb_up 추천메뉴 바로가기


1 정규식 표기법[편집]

1) ^  : 문자열의 시작 부분과 일치. 매칭 파라미터의 m 옵션이 활성화되면 표현식을 사용하는 모든 행의 시작과 일치

$       : 문자열의 끝 부분과 일치. 매칭 파라미터의 m 옵션이 활성화되면 표현식을 사용하는 모든 행의 끝과 일치
*       : 0개 이상 (zero or more) 일치
+       : 하나 이상 (one or more) 일치
?       : 0 또는 1개 일치 (zero or one)
.       : NULL을 제외한 모든 문자와 일치
I(파이프) : OR
[ ]     : [ ]에 있는 문자 중 하나를 일치시키려는 목록을 지정
[^ ]    : [ ]에 있는 문자를 제외한 모든 문자를 일치시키려는 리스트 지정 
( )     :표현식을 하위 표현식으로 그룹화하는데 사용
{m}     :m번 일치
{m,}    :적어도 m번 일치
{m,n}   :적어도 m번 일치 ~ n번 이하 일치
\n      :() 번째 하위 표현식과 일치
[..]    :하나 이상의 문자가 될 수 있는 하나의 집합요소와 일치
[::]    :문자 클래스와 일치. [:digit:], [:punct:], [:alpha:] 등
[==]    :equivalence 클래스와 일치
\d      :숫자와 일치
\D      :숫자가 아닌 것과 일치
\w      :영문자 숫자 밑줄문자(_) 와 일치
\W      :영문자 숫자 밑줄문자(_) 이외의 문자와 일치
\s      :공백문자와 일치
\S      :공백이 아닌 문자와 일치
\A      :문자열의 시작 부분과 일치, 혹은 새 행의 문자 앞에 있는 문자열의 끝 부분과 일치
\Z      :문자열의 끝과 일치
*?      :앞선 패턴이 0번 이상 발생
+?      :앞선 패턴이 한 번 이상 발생
??      :앞선 패턴이 0 또는 1번 발생
{n}?    :앞선 패턴이 n번 일치
{n,}?   :앞선 패턴이 적어도 n번 일치
{n,m}?  :앞선 패턴이 적어도 n번 ~ m번 이하 일치



2 정규식 예시[편집]

2.1 REGEXP_REPLACE[편집]

regexp_replace.gif


1) REGEXP_REPLACE(COLUMN, [REG_EXP], [REPLACE_STR], [START_INDEX], [REPLACE_INDEX])



  1. replacement_string
    Optional. Matched patterns will be replaced with replacement_string in string. If the replacement_string parameter is omitted, the function simply removes all matched patterns, and returns the resulting string.
  2. start_position
    Optional. It is the position in string where the search will start. If omitted, it defaults to 1 which is the first position in the string.
  3. nth_appearance
    Optional. It is the nth appearance of pattern in string. If omitted, it defaults to 1 which is the first appearance of pattern in string. If you specify 0 for this parameter, all appearances of pattern will be replaced in string.
  4. match_parameter
    Optional. It allows you to modify the matching behavior for the REGEXP_REPLACE function.

WITH T AS (
            SELECT '김, 수 영' NAME FROM DUAL
  UNION ALL SELECT 'KIM/SUYOUNG'  FROM DUAL            
  UNION ALL SELECT 'KIM suYOUNG'  FROM DUAL
  UNION ALL SELECT 'KIM su YOUNG'  FROM DUAL  
  UNION ALL SELECT 'KIM su,YOUNG'  FROM DUAL
  UNION ALL SELECT 'KIM,su/YOUNG'  FROM DUAL
  UNION ALL SELECT '김 수한무 거북이와 두루미 삼천갑자 동방석'  FROM DUAL               
  UNION ALL SELECT 'lee dkd dkdk dkdkd kd dkdkdkd 1 2 2'  FROM DUAL  
)
SELECT REGEXP_SUBSTR(NAME, '[^ /,]+', 1) 성
     , REGEXP_REPLACE(NAME, '([^ /,]+)([^가-힣a-zA-Z]+)([^/,-]+)', '\3\4\5') 이름     
  FROM T;
--치환할 문자를 |로 구분하여 입력
 SELECT REGEXP_REPLACE('Stay Hungry, Stay Foolish. - Steve Jobs', 'Stay|Foolish|Steve', '')
   FROM DUAL

 --결과:  Hungry,  . -  Jobs
 ;

 --문자를 제거만 할꺼면 3번재 파라미터는 생략가능
 SELECT REGEXP_REPLACE('Stay Hungry, Stay Foolish. - Steve Jobs', 'Stay|Foolish|Steve')
   FROM DUAL

 --결과:  Hungry,  . -  Jobs
 ;

 SELECT REGEXP_REPLACE('Stay Hungry, Stay Foolish. - Steve Jobs 2005', 'Stay|Foolish|Steve', '###')
   FROM DUAL

 --결과: ### Hungry, ### ###. - ### Jobs 2005
 ;

 --특수문자 제거
 SELECT REGEXP_REPLACE('Stay Hungry, Stay Foolish. - Steve Jobs', '[[:punct:]]')
   FROM DUAL

 --결과: Stay Hungry Stay Foolish  Steve Jobs
 ;

 --숫자를 제외한 모든문자 제거 (숫자만)
 SELECT REGEXP_REPLACE('Stay Hungry, Stay Foolish. - Steve Jobs 2005', '[^[:digit:]]')
   FROM DUAL
 
 --결과: 2005
 ;

 --$같은 특수문자를 치환하기 위해서는 Escape 문자(\)를 붙여 줘야함
 SELECT REGEXP_REPLACE('$Stay Hungry, Stay Foolish. - Steve Jobs', '-|\$')
   FROM DUAL

 --결과: Stay Hungry, Stay Foolish.  Steve Jobs

2.2 REGEXP_SUBSTR[편집]

regexp_substr.gif


REGEXP_SUBSTR(COLUMN, [REG_EXP], [START_INDEX], [GROUP_INDEX])

  • COLUMN : 컬럼명
  • REG_EXP : 정규표현식 작성
  • START_INDEX : 해당 정규표현식을 검색할 문자열의 INDEX 지정
  • GROUP_INDEX : 해당 정규표현식으로 잘라진 그룹이 2개 이상이라면 INDEX 지정해 그룹 선택



— |으로 구분자 나누기 
— regexp_substr(A.TXT,’[^_]+’,1,1) 1번째
SELECT distinct regexp_substr(A.TXT, '[^|]+', 1, LEVEL) TXT
   FROM (SELECT 'A|B|C|D' TXT FROM dual) A
CONNECT BY LEVEL <= length(regexp_replace(A.TXT, '[^|]+',''))+1
;
SELECT REGEXP_SUBSTR('test@domain.com', '[^@]+', 1, 1) AS EMAIL_ID
     , REGEXP_SUBSTR('test@domain.com', '[^@]+', 1, 2) AS EMAIL_DOMAIN
 FROM    REG_EXP_TEST
  • COLUMN TO ROW (컬럼 => 로우)
SELECT TRIM(REGEXP_SUBSTR('02,031,032','[^,]+',1,LEVEL)) AS  LIST_TO_ROW
      FROM DUAL
 CONNECT BY INSTR('02,031,032', ',', 1, LEVEL-1 ) > 0

2.3 REGEXP_LIKE[편집]

WITH TEMP_TABLE AS (
   SELECT 'Samsung Galaxy Note 4' TEXT FROM dual union all
   SELECT 'Apple iPhone 6 Plus' TEXT FROM dual union all
   SELECT 'Samsung Galaxy S5' TEXT FROM dual union all
   SELECT 'Apple iPhone 6' TEXT FROM dual union all
   SELECT 'LG G3' TEXT FROM dual union all
   SELECT 'SonyXperia Z3' TEXT FROM dual union all
   SELECT 'Motorola Moto G' TEXT FROM dual union all
   SELECT 'HTC One M8' TEXT FROM dual union all
   SELECT 'Nokia Lumia 930' TEXT FROM dual
)
SELECT *
   FROM TEMP_TABLE
 WHERE REGEXP_LIKE(TEXT, 'Samsung|Apple|Nokia')
  • 다건 검사
REGEXP_LIKE(TOBE_COL_NM, '_AMT|_AMT2|_CPM|_PNT|_QTY|_RT|_VAT')