오라클 정규식 공백 - olakeul jeong-gyusig gongbaeg


IT Tech & Knowledge

2020. 11. 28. 23:14

정규식을 잘 사용하면 SQL과 각 종 프로그램의 연산속도를 감소시키며 프로그램을 단순화 시킬 수 있습니다.

시간이 걸리더라도 한번씩 사용해보면 좋습니다.   

. 하나의 문자를 의미합니다.  ".*"하면 한개이상의 문자 즉 모든 문자를 의미합니다.
$ 끝을 의미한다. AAA$ 하면 AAA로 끝나는 것을 의미한다.
\ 특수 문자를 문자로 인식할때 사용합니다.
¦ 여러 식 중에서 하나를 선택합니다. SQL의 OR조건과 같습니다. "abc¦adc"는 abc와 adc 문자열을 모두 포함한다.
^ 문자 클래스 안의 문자를 제외한 나머지를 선택한다. 예를 들면 [^abc]d는 ad, bd, cd는 포함하지 않습니다. [^a-z]는 알파벳 소문자로 시작하지 않는 모든 문자를 의미한다.
[] "["과 "]" 사이의 문자 중 하나를 선택한다. "¦"를 여러 개 쓴 것과 같은 의미이다. 예를 들면 [abc]d는 ad, bd, cd를 뜻한다. 또한, "-" 기호와 함께 쓰면 범위를 지정할 수 있다. "[a-z]"는 a부터 z까지 중 하나, "[1-9]"는 1부터 9까지 중의 하나를 의미한다.
() 여러 식을 하나로 묶을 수 있다. "abc¦adc"와 "a(b¦d)c"는 같은 의미를 가진다.
* 0개 이상의 문자를 포함한다. "a*b"는 "b", "ab", "aab", "aaab"를 포함한다.
+ "a+b"는 "ab", "aab", "aaab"를 포함하지만 "b"는 포함하지 않는다. [+ 앞 내용 기준]
 ? "a?b"는 "b", "ab"를 포함한다. [? 다음 내용 기준]
{m} "a{3}b"는 "aaab"만 포함한다.
{m,} "a{2,}b"는 "aab", "aaab", "aaaab"를 포함한다. "ab"는 포함되지 않는다.
{m, n} "a{1,3}b"는 "ab", "aab", "aaab"를 포함하지만, "b"나 "aaaab"는 포함하지 않는다
\n 1에서 9까지의 숫자를 의미
\d Matches a digit character.
\D Matches a nondigit character.
\w Matches a word character.
\W Matches a nonword character.
\s Matches a whitespace character.
\S matches a non-whitespace character.

자주 사용하는 Class Syntex는 아래와 같습니다. 

[:alnum:] 영어와 숫자
[:alpha:] 알파벳, [A-Za-z]
[:blank:] 공백과 탭
[:digit:] 숫자
[:lower:] 소문자, [a-z]
[:punct:] 특수문자
[:space:] 공백(스페이스)
[:upper:] 대문자, [A-Z]
[가-힣] 한글전체

자주 사용하는 응용편

1. "["와 "]" 사이에 문자를 공백 처리하기,  괄호의 정의를 정하고 사이의 내용을 제거하면 됩니다.

regexp_replace(s, "\\[.*\\]", "")

2. 숫자와 문자를 제외하고 모두 제거 

regexp_replace(nm, '[^A-Z0-9 ]', '')

3. 공백이 2개 이상인 부분을 제거 

REGEXP_REPLACE('Kontext is a website for data engineers.','[\s]{2,}', '')

4. 끝에 문자가 _(으로 시작하고)_(으로 사작하지 않는) 문자로 끝나는 것 

regexp_replace('The_quick brown fox jumped over the_fence', '_[^_]*$','')


목차

  • 1 정규식 표기법
  • 2 정규식 예시
    • 2.1 REGEXP_REPLACE
    • 2.2 REGEXP_SUBSTR
    • 2.3 REGEXP_LIKE

1 정규식 표기법

assignment 정규식 표기 설명

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

오라클 정규식 공백 - olakeul jeong-gyusig gongbaeg

assignment REGEXP_REPLACE

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

오라클 정규식 공백 - olakeul jeong-gyusig gongbaeg

assignment REGEXP_SUBSTR

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('', '[^@]+', 1, 1) AS EMAIL_ID
     , REGEXP_SUBSTR('', '[^@]+', 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')