상세 컨텐츠

본문 제목

오라클 정규표현식(REGEXP)

데이터베이스

by e7e 2024. 2. 20. 12:51

본문

정규표현식 엔진은 TEXT 처리를 최강 목표로 맹글어진 

Perl 언어의 엔진이 일반적으로 최강으로 받아들여지고, 다른 언어들은 그것의

일부를 가져다 쓰거나, 모방을 하게 된당.

 

개발자들이 사용하는 IDE(이클립스,VSCODE등)나 에디터 에서 키워드 색깔이

일괄적으로 바뀌는 데에 정규표현식 엔진이 사용된당.(느낌?)

 

느군강?? SQL에서 정규표현식을 물어 뜨드려 했던 것 같당! 무섭당!

마니 복잡한 걸  맹글 땐 껌색의 도움을 받공, 아래 정도의 내용으로 안분지족 해보장!

정규표현식을 하려면 최소 아래 메타문자의 의미 정도는 외워야디용

  문자 의미
.    암거나 1개 문자
?   없거나 1개 문자
|   A|B   A 또는 B
[]   [abc | 가나다]   abc 또는 가나다  
[-]  [a-z] a에서 z까지  [0-9] 0에서 9까지
[^]  [^a]  a가 아닌 것
\  escape 처리
^ ^e7e   e7e로 시작하는 거
$ e7e$  e7e로 끝나는 거

 

오라클 제공 정규표현식(REGEXP) 명령어 세트

명령 결과    비고
REGEXP_LIKE True/False 조건으로만 사용가능
REGEXP_REPLACE 치환  
REGEXP_INSTR 시작위치  
REGEXP_SUBSTR 일치하는 문자열  
REGEXP_COUNT 일치하는 패턴 횟수          

 

REGEXP_LIKE  불량 예시 (조건으로 사용되지 않아서 에렁)

select REGEXP_LIKE('I Like KSJ Very Much But Little Love', 'ksj', 'i') from dual;

-- 에러 ORA-00904: "REGEXP_LIKE": invalid identifier

 

REGEXP_LIKE  양호 예시(조건으로 사용)

SELECT CASE
  WHEN REGEXP_LIKE('I Like KSJ Very Much But Little Love', 'ksj', 'i') 
  	THEN 'KSJ 좋앙'
  	ELSE 'KSJ 별롱'
  END 결과
FROM DUAL;

 

REGEXP_LIKE  양호 예시(꼬옥 누느로 결과 화긴사살)

-- 결과 True 인 경우
select *  from dual where REGEXP_LIKE('I Like KSJ Very Much But Little Love', 'ksj', 'i');

-- 결과 False인 경우
select *  from dual where REGEXP_LIKE('I Like KSJ Very Much But Little Love', 'gsj', 'i');

 

REGEXP_REPLACE 예시(척보면 앱니당)

select  REGEXP_REPLACE ('E7E like jenni', '[j|J]enni', 'Roze') from dual;

 

REGEXP_INSTR 예시(뜬금포 프로시저)

bind 변수 먼징 알디용?

-- 괘니 PROCEDURE 이용
VARIABLE startindex NUMBER;
DECLARE
    emailaddr VARCHAR2(30) := '';
BEGIN
    SELECT  REGEXP_INSTR('my email address is e7e@e7e.com', '\w+@\w+(\.\w+)+')  INTO :startindex FROM DUAL;
    DBMS_OUTPUT.PUT('이메일 시작위치: ');
    DBMS_OUTPUT.PUT_LINE(:startindex);
    
    SELECT SUBSTR('my email address is e7e@e7e.com', :startindex) INTO emailaddr FROM DUAL;
    DBMS_OUTPUT.PUT('이메일주소: ');    
    DBMS_OUTPUT.PUT_LINE(emailAddr);    -- emailAddr 대소문자 상관없음에도 괘니 주목
END;


-- 괘니 SUB QUERY 이용
WITH  selindex AS
(
  SELECT  REGEXP_INSTR('my email address is e7e@e7e.com', '\w+@\w+(\.\w+)+')  as sindex FROM DUAL
)
SELECT SUBSTR( 'my email address is e7e@e7e.com',sindex) FROM selindex;

 

REGEXP_SUBSTR 예시(꼬옥 누네 힘주어 한 줄씩  파라미터값과 결과값 의미 확인)

-- 매개변수 순서별 의미
-- 대상문자열, 패턴, 시작위치(최소1),발생횟수,매치 옵션 , subexpr(0~9) 곧 ()의 의미
-- 매치 옵션  i,c,n,m,x

SELECT  REGEXP_SUBSTR('AbCdEFGH', '(abc)(d(ef)(gh))', 1,1) AS 결과 FROM DUAL;
-- null

SELECT  REGEXP_SUBSTR('AbCdEFGH', '(abc)(d(ef)(gh))', 1,1,'i') AS 결과 FROM DUAL;
-- AbCdEFGH

SELECT  REGEXP_SUBSTR('AbCdEFGH', '(abc)(d(ef)(gh))', 1,1,'i',1) AS 결과 FROM DUAL;
-- AbC

SELECT  REGEXP_SUBSTR('AbCdEFGH', '(abc)(d(ef)(gh))', 1,1,'i',2) AS 결과 FROM DUAL;
-- dEFGH

SELECT  REGEXP_SUBSTR('AbCdEFGH', '(abc)(d(ef)(gh))', 1,1,'i',3) AS 결과 FROM DUAL;
-- EF

SELECT  REGEXP_SUBSTR('AbCdEFGH', '(abc)(d(ef)(gh))', 1,1,'i',4) AS 결과 FROM DUAL;
-- GH

SELECT  REGEXP_SUBSTR('AbCdEFGH', '(abc)(d(ef)(gh))', 1,1,'i',5) AS 결과 FROM DUAL;
-- null

 

REGEXP_COUNT 예시

-- c는 대소문자 구분, default
-- i는 대소문자 무시
SELECT  REGEXP_COUNT('e7e Manse EE', 'e', 1, 'c') AS 결과 FROM DUAL;
-- 3

SELECT  REGEXP_COUNT('e7e Manse EE', 'e', 1) AS 결과 FROM DUAL;
-- 3

SELECT  REGEXP_COUNT('e7e Manse EE', 'e', 3, 'i') AS 결과 FROM DUAL;
-- 4

 

매칭파라미터 참조

 

혹여 쓸 일이 있다면 그저 한번씩 써보장!  그거로 퉁분하고 퉁분탕!

 


 

 

따아쓰암이 쪼메만 더 내리공,

빗방울 갯수가 따블로 파편되어 공허한 음악으로 흐른다면

화들짝 내 유전자의 감수성이 깨어 날 지도 모르는 나알씨당.

머 콩알 콩알 내리는 비도 끝 없는 터널로 날 잘도 이끈당.

 

금수저의 손바닥 비늘을 계속 긁고 긁어내어

그 손이 위엄있는 주방장의 유전자란 사실에

흠짓 당황스러웠지만, 그렇지만 마니 기뻤당

비밀스런 다행이었당.

 

비가 억수로 오고, 등골이 쪼메 오싹해지는

천둥도  잊혀지지 않기 위해 노력하는 바로 그런 날에

창이 어엄청 넓고 소온님은 그키 저근 사암겹살 지베서,

빗소리 웅장한 창가에 마주 말고,

나란히 앉아 거나하게 마시고, 헤어지는 꾸믈 꾸었당.

 

뒤 돌아가고 싶지만, 결코 뒤 도라 보면 안되는 

그런 애트탐을 앙마에게 카톡 선물하기로

선물하고픈 그런 날에 마리당.

 

비얌! 너의 따뜻한 소리로

오싹함으로 꽁꽁된 내 유전자의 이불을

살짜기 살짜기 걷어다옹!

내 유전자 향은 라일락 향이당!~~~

아니야, 아냐 니 향은 목련이얌, 목련향이 다그친당!~~

 

 

 

https://www.youtube.com/watch?v=IJ2To9o-fRc

 

관련글 더보기