본문 바로가기

DB

[oracle] 정규식을 사용하는 REGEXP 함수

오라클 10g 이상에서 추가된 정규식 관련 함수를 텍스트 리터럴, 바인딩 변수, 문자 데이터를 포함하는 열에서 사용할 수 있습니다. ( LONG 타입을 제외한 CHAR, NCHAR, CLOB, NCLOB, NVARCHAR2, VARCHAR2 )

정규식 함수 및 조건

REGEXP_LIKE

단순한 LIKE 를 넘어 정규식 일치를 수행하는 데 사용됩니다. boolean을 반환합니다. 

문법

REGEXP_LIKE ( string, pattern [, matching parameter ] )

REGEXP_LIKE ( 해당 문자열, 정규식 패턴 [, 매칭 매개변수] )

 

string 문자열

검색될 문자열입니다.

 

pattern 정규식 패턴

비교할 정규식 패턴을 나타내는 리터럴 문자열입니다.

 

matching parameter 매칭 파라미터

해당 파라미터는 다음과 같습니다.

  • 'i' : 대소문자를 구분하지 않습니다.
  • 'c' : 대소문자를 구분합니다. (기본값)
  • 'n' : 마침표(.) 문자가 새 라인과 일치하도록 허용합니다. 
  • 'm' : 소스 문자열을 앵커 문자(^ | $)를 활성화하는 여러 줄로 처리합니다. 
  • 'x' : 공백 문자를 무시합니다.

예제

last_name이 'n'으로 끝나는 것

SELECT last_name
FROM contacts
WHERE REGEXP_LIKE (last_name, '(*)n$');

last_name이 'A'로 시작하는 것

SELECT last_name
FROM contacts
WHERE REGEXP_LIKE (last_name, '^A(*)');

REGEXP_REPLACE

문자열에서 패턴을 검색하고 해당 패턴의 각 발생항목을 지정된 문자열로 바꿉니다. 

문법

REGEXP_REPLACE( string, pattern [, replacement_string [, start_position [, nth_appearance [, matching parameter ] ] ] ] )

REGEXP_REPLACE( 해당 문자열, 정규식 패턴, [, 대체문자열 [, 시작위치 [, 일치횟수 [, 매칭 매개변수 ] ] ] ] )

 

위와 중복되는 파라미터는 생략하겠습니다.

replacement_string 대체문자열

해당 문자열과 패턴이 일치할 때 대체될 문자입니다. 생략할 시 패턴에 일치하는 문자가 제거됩니다.

 

start_position 시작위치

검색 시작 위치를 지정합니다. 기본값은 1입니다.

 

nth_appearance 일치횟수

n번째 일치된 문자열을 대체합니다. 기본값은 0이며 모든 값을 대체합니다. 

예제

'Anderson' 에서 a,e,i,o,u 를 첫번째 자리부터 모두 찾아 'G'로 변경합니다. 대소문자를 구별하지 않습니다.

SELECT REGEXP_REPLACE ('Anderson', 'a|e|i|o|u', 'G', 1, 0, 'i')
FROM dual;

Result: 'GndGrsGn'

 

지정된 문자열의 숫자를 모두 '#'으로 바꿉니다.

SELECT REGEXP_REPLACE ('2, 5, and 10 are numbers in this example', '\d', '#')
FROM dual;

Result: '#, #, and ## are numbers in this example'

REGEXP_INSTR

지정된 정규식 패턴이 발생하는지 문자열을 검색하고 일치 항목이 있는 문자열의 위치(숫자 값)를 반환하고, 미일치시 0을 반환합니다. 프로그래밍 언어와는 다르게, 맨 처음 문자의 위치는 0이 아니라 1입니다. 

문법

REGEXP_INSTR( string, pattern [, start_position [, nth_appearance [, return_option [, matching parameter ] ] ] ] )

REGEXP_INSTR( 해당 문자열, 정규식패턴 [, 시작위치 [, 일치횟수 [, 반환할 문자위치 [, 매칭 파라미터  ] ] ] ] )

 

역시 위에서 언급한 파라미터는 생략합니다.

 

return_option 반환할 문자 위치

생략시 기본값은 0이며, 0이면 첫번째 문자 위치를 반환합니다. 

예제

아래 문장에서 'ow'가 처음 나타나는 위치를 반환합니다. 대소문자를 구별하지 않습니다. 

SELECT REGEXP_INSTR ('The example shows how to use the REGEXP_INSTR function', 'ow', 1, 1, 0, 'i')
FROM dual;

Result: 15

REGEXP_SUBSTR

지정된 정규식 패턴과 일치하는 하위 문자열을 반환합니다.

문법

REGEXP_SUBSTR( string, pattern [, start_position [, nth_appearance [, match_parameter ] ] ] )

REGEXP_SUBSTR( 해당 문자열, 정규식패턴 [, 시작위치 [, 일치횟수 [, 매칭 파라미터 ] ] ] )

예제

last_name에서 첫 번째 모음(a,e,i,o,u)이 나타나면 반환합니다. 대소문자를 구분하지 않습니다. 

SELECT REGEXP_SUBSTR (last_name, 'a|e|i|o|u', 1, 1, 'i') AS "First Vowel"
FROM contacts;

참고) 정규식 패턴

^ 문자열의 시작 부분과 일치. 매칭 파라미터의 m 옵션이 활성화되면 표현식을 사용하는 모든 행의 시작과 일치
$ 문자열의 끝 부분과 일치. 매칭 파라미터의 m 옵션이 활성화되면 표현식을 사용하는 모든 행의 끝과 일치
* 0개 이상 (zero or more) 일치
+ 하나 이상 (one or more) 일치
? 0 또는 1개 일치 (zero or one)
. NULL을 제외한 모든 문자와 일치
| 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번 이하 일치