ORACLE REGEXP
HACKERRANK를 풀다가
내가 기존에 알던 함수로는 풀기 어렵다고 느껴져
찾게된 REGEXP 기록,,,
보아하니 MYSQL과 ORACLE의 방식이 조금 다르기도 한 거 같고,,
아니 다른건가..? 같은 거 같으면서도
코딩 돌리면 MYSQL 방식으론 맞고 ORACLE 방식으론 틀리기도하고,,,
아직 정확하게 정리가 안된듯 ㅠㅠ
여튼
헷갈릴 때
바로 볼 수 있게끔 퍼왔다!!
먼저
ORACLE - REGEXP
-정규식 함수 및 조건
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번 이하 일치 |
그리고 MYSQL REGEXP!
개인적으론 MYSQL 방식이 더 이용하기 수월하다고 느껴져따....
언젠간 모든게 익숙해지겠지 ㅜㅅㅜ
MySQL 정규표현식 활용하여 데이터 검색하기
SQL에서 특정 문자열 조건을 가진 데이터를 검색해야 하는 경우가 종종 있습니다.
like는 보다 복잡하고 다양한 문자열 패턴을 검색할 때 쿼리가 상당히 지저분해지는 단점이 있기에
이를 보완할 수 있는 REGEXP 정규표현식에 대해 알아보겠습니다.
정규표현식이란?
- 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어
- 문자열을 처리하는 방법 중의 하나로, 특정한 조건의 문자를 ‘검색’하거나 ‘치환’하는 과정을 매우 간편하게 처리할 수 있도록 해주는 수단
- SQL부터 스크립트 언어까지 다양한 곳에서 활용될 수 있으며 Pattern을 사용해서 문자열을 처리
- 찾고자 하는 대상에서 정규표현식을 사용해 해당 Pattern과 일치하는 문자열 검색
자주 사용하는 패턴 방식
▣ 매칭 (Matching)
패턴 | 기능 | 사용 예시 | 설명 |
. | 문자 하나 | "..." | 문자열의 길이가 세 글자 이상인 것을 찾음. |
| | 또는 (OR). |로 구분된 문자에 해당하는 문자열을 찾음. |
"데이터|데이타" | ‘데이터’ 또는 ‘데이타’에 해당하는 문자열을 찾음. |
[] | [] 안에 나열된 패턴에 해당하는 문자열을 찾음. | "[123]d" | 대상 문자열에서 ‘1d’ 또는 ‘2d’ 또는 ‘3d’인 문자열을 찾음. |
^ | 시작하는 문자열을 찾음. | "^시작" | 대상 문자열에서 ‘시작’으로 시작하는 문자열을 찾음. |
$ | 끝나는 문자열을 찾음. | "끝$" | 대상 문자열에서 ‘끝’으로 끝나는 문자열을 찾음. |
▣ 횟수 (times)
패턴 | 기능 | 사용 예시 | 설명 |
* | 0회 이상 나타나는 문자 | "a*" | ‘a’가 0번 이상 등장하는 문자열을 찾음. ‘b’, ‘a’, ‘aa’ 모두 해당. |
+ | 1회 이상 나타나는 문자 | "찌개+" | ‘국’이 1번 이상 등장하는 문자열을 찾음. ‘김치찌개’, ‘된장찌개’, ‘부대찌개’ 모두 해당. |
{m,n} | m회 이상 n회 이하 나타나는 문자 | "치{1,2}" | ‘치’가 1회 이상 2회 이하 등장하는 문자열을 찾음. ‘치커리’, ‘치카치카’ 모두 해당. |
? | 0~1회 나타나는 문자 | "[가나다]?" | ‘가’ 또는 ‘나’ 또는 ‘다’가 0~1회 등장하는 문자열을 찾음. ‘가지마’, ‘나라’, ‘안녕’ 모두 해당. |
▣ 그룹 형태(group)
패턴 | 기능 | 사용 예시 | 설명 |
[A-z] 또는 [:alpha:] 또는 \a | 알파벳 대문자 또는 소문자인 문자열을 찾음 | "[A-z]+" | 대상 문자열에서 알파벳이 한 개 이상인 문자열을 찾음 |
[0-9] 또는 [:digit:] 또는 \d | 숫자인 문자열을 찾음 | "^[0-9]+" | 한 개 이상의 숫자로 시작하는 문자열을 찾음 |
[^문자] | 괄호 안의 문자를 포함하지 않은 문자열을 찾음 | "[^부정]" | ‘부’ 또는 ‘정’을 포함하지 않는 문자열을 찾음. ‘부자’, ‘정말’ 모두 제외됨 |
정규표현식 활용 in MySQL (LIKE와 REGEXP 비교)
Sample Data : Products (링크 바로가기)
# REGEXP 활용
select productid, productname, unit from products
where unit regexp 'boxes|pieces';
# LIKE 활용
select productid, productname, unit from products
where unit like '%boxes%' or unit like '%pieces%';
*출처 - [oracle] 정규식을 사용하는 REGEXP 함수 (tistory.com)
https://codingspooning.tistory.com/entry/MySQL-정규표현식-검색하기-REGEXP-LIKE [코딩하는 금융인:티스토리]