1. 정규표현식
1️⃣ 기초 개념
1) 정규표현식
- 문자와 기호를 조합하여 특정 패턴을 정의하는 방식
- 기본 구성 요소 : 문자, 숫자, 특수 문자 등
- 특정한 규칙을 따라 조합되어 복잡한 검색 조건 만들 수 있음
2️⃣ 정규표현식의 주요 구성 요소
1) 문자 클래스
- 대괄호
[]안에 여러 문자를 넣어 하나의 문자 집합을 정의
[abc]: ‘a’, ‘b’, ‘c’ 중 하나의 문자
[a-z]: 소문자 알파벳 중 하나의 문자
[^abc]: ‘a’, ‘b’, ‘c’를 제외한 모든 문자
2) 메타 문자
- 특별한 의미를 가진 문자들
.: 임의의 한 문자
\d: 숫자
\D: 숫자가 아닌 문자
\w: 알파벳 문자나 숫자, 밑줄
\W: 알파벳 문자나 숫자, 밑줄이 아닌 문자
\s: 공백 문자
\S: 공백 문자가 아닌 문자
3) 수량자
- 특정 패턴이 반복되는 횟수 정의
*: 0회 이상 반복
+: 1회 이상 반복
?: 0회 도는 1회
{n}: 정확히 n회
{n,}: n회 이상
{n, m}: n회 이상 m회 이하
4) 경계 지정자
- 특정 위치 지정
^: 문자열의 시작
$: 문자열의 끝
\b: 단어 경계
\B: 단어 경계가 아님
2. 정규표현식 문법
1️⃣ POSIX 연산자
1) POSIX(Portable Operating System Interface) 정규표현식
- 유닉스 기반 시스템에서 널리 사용되는 표준 정규표현식 규칙
- 기본 모드(POSIX Basic Regular Expressions, BRE)와
확장 모드(POSIX Extended Regular Expressions, ERE) 두 가지 제공
2) REGEXP_SUBSTR 함수
- 주어진 문자열에서 정규표현식 패턴과 일치하는 첫 번째 부분 문자열 반환
REGEXP_SUBSTR(source_string, pattern).→ dot 연산자 예시
SELECT REGEXP_SUBSTR ('aab', 'a.b') AS C1,
REGEXP_SUBSTR ('abb', 'a.b') AS C2,
REGEXP_SUBSTR ('acb', 'a.b') AS C3,
REGEXP_SUBSTR ('adc', 'a.b') AS C4
FROM DUAL;C1 | C2 | C3 | C4 |
aab | abb | acb | NULL |
a.b : ‘a’로 시작하고, 임의의 한 문자(.)를 포함하여 ‘b’로 끝나는 문자열|→ or 연산자 예시
SELECT REGEXP_SUBSTR ('apple', 'a|e') AS C1,
REGEXP_SUBSTR ('banana', 'a|b') AS C2,
REGEXP_SUBSTR ('abcdef', 'ab|cd') AS C3,
REGEXP_SUBSTR ('cdefgh', 'ab|cd') AS C4
FROM DUAL;C1 | C2 | C3 | C4 |
a | b | ab | cd |
a|b : ‘a’ 또는 ‘e’ 중에서 첫 번째로 일치하는 부분 문자열 찾음\→ backslash 연산자 예시
SELECT REGEXP_SUBSTR ('a.b', 'a\.b') AS C1,
REGEXP_SUBSTR ('aab', 'a\.b') AS C2,
REGEXP_SUBSTR ('a\\b', 'a\\\\b') AS C3,
REGEXP_SUBSTR ('a\b', 'a\\\\b') AS C4
FROM DUAL;C1 | C2 | C3 | C4 |
a.b | NULL | a\\b | NULL |
\ : \뒤에 오는 특수 문자를 문자 칼럼 그래도 표시a\.b → a.b^,$: 앵커(anchor) 연산자 예시^: 문자열 시작을 의미$: 문자열의 끝을 의미
SELECT REGEXP_SUBSTR ('apple', '^a') AS C1,
REGEXP_SUBSTR ('banana', '^a') AS C2,
REGEXP_SUBSTR ('apple pie', '^apple') AS C3,
REGEXP_SUBSTR ('apple', 'e$') AS C4,
REGEXP_SUBSTR ('banana', 'a$') AS C5,
REGEXP_SUBSTR ('apple pie', 'pie$') AS C6,
REGEXP_SUBSTR ('apple', '^apple$') AS C7,
REGEXP_SUBSTR ('banana', '^apple$') AS C8,
REGEXP_SUBSTR ('apple pie', '^a.*e%') AS C9
FROM DUAL;C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 | C9 |
a | NULL | apple | e | a | pie | apple | NULL | apple |
- 수량자(quantifier) 연산자의 예시
- 수량자(quantifier) 연산자 : 특정 패턴의 반복 횟수 지정
수량자 연산자 | 해설 |
* | 0회 이상 반복
예) a*는 “”, “a”, “aa”, “aaa” 등과 일치 |
+ | 1회 이상 반복
예) a+는 “a”, “aa”, “aaa” 등과 일치하지만 “”와는 일치하지 않음 |
? | 0회 또는 1회 발생
예) a?는 “”, “a”와 일치 |
{n} | 정확히 n회 반복
예) a{3}은 “aaa”와 일치 |
{n,} | n회 이상 반복
예) a{2,}는 “aa”, “aaa”, “aaaa” 등과 일치 |
{n,m} | n회 이상 m회 이하 반복
예) a{2,4} 는 “aa”, “aaa”, “aaaa” 와 일치 |
SELECT REGEXP_SUBSTR ('ac', 'ab*c') AS C1,
REGEXP_SUBSTR ('abc', 'ab*c') AS C2,
REGEXP_SUBSTR ('abbc', 'ab*c') AS C3,
REGEXP_SUBSTR ('ac', 'ab+c') AS C4,
REGEXP_SUBSTR ('abc', 'ab+c') AS C5,
REGEXP_SUBSTR ('abbc', 'ab+c') AS C6,
REGEXP_SUBSTR ('ac', 'ab?c') AS C7,
REGEXP_SUBSTR ('abc', 'ab?c') AS C8,
REGEXP_SUBSTR ('abbc', 'ab?c') AS C9
FROM DUAL;C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 | C9 |
ac | abc | abbc | NULL | abc | abbc | ac | abc | NULL |
SELECT REGEXP_SUBSTR ('aaa', 'a{3}') AS C1,
REGEXP_SUBSTR ('aaaa', 'a{3}') AS C2,
REGEXP_SUBSTR ('aaa', 'a{2,}') AS C3,
REGEXP_SUBSTR ('aaa', 'a{2,4}') AS C4,
REGEXP_SUBSTR ('aaaaa', 'a{2,4}') AS C5
FROM DUAL;C1 | C2 | C3 | C4 | C5 |
aaa | aaa | aaa | aaa | aaaa |
()→ 괄호 연산자 예시- 괄호 연산자 기능
그룹화
(Grouping) | • 괄호 ()를 사용하여 정규표현식 내에서 패턴 그룹화할 수 있음
• 그룹화된 패턴에 대해 수량자 적용하거나, 패턴의 일부분 묶어서 재사용 가능
• 예) (abc)+는 ‘abc’라는 문자열이 하나 이상 반복되는 경우에 일치 |
캡처
(Capturing) | • 그룹화된 패턴은 캡처되며, 나중에 이를 참조할 수 있음
• 캡처된 그룹은 정규표현식 나머지 부분에서 백슬래시( \)와 숫자(\1, \2, 등)를 사용하여 참조 가능
• 예) (abc) \1은 ‘abcabc’와 일치. 여기서 \1은 첫 번째 그룹(abc) 참조 |
SELECT REGEXP_SUBSTR ('ababab', '(ab)+') AS C1,
REGEXP_SUBSTR ('abcdabcd', '(ab)(cd) \1\2') AS C2,
REGEXP_SUBSTR ('abcabc', '(abc){2}') AS C3
FROM DUAL;C1 | C2 | C3 |
ababab | abcdabcd | abcabc |
- 문자 리스트(character list) 연산자 예시
SELECT REGEXP_SUBSTR ('apple', '[abc]') AS C1,
REGEXP_SUBSTR ('cat', '[a-c]') AS C2,
REGEXP_SUBSTR ('zip code 12345', '[0-9]') AS C3,
REGEXP_SUBSTR ('cherry', '[^abc]') AS C4
FROM DUAL;C1 | C2 | C3 | C4 |
a | c | 1 | h |
2️⃣ PERL 정규표현식 연산자
1) PERL
- 강력한 정규표현식 기능 제공
- POSIX 문자 클래스와 유사하게 동작
2) PERL 정규표현식 연산자
NO | 연산자 | 해설 | 동일 |
1번 | \d | 숫자 | [[:digit:]] |
2번 | \D | 숫자가 아닌 모든 문자 | [^[:digit:]] |
3번 | \w | 숫자와 영문자 (언더바 포함) | [[:alnum:]_] |
4번 | \W | 숫자와 영문자가 아닌 모든 문자 (언더바 제외) | [^[:alnum:]] |
5번 | \s | 공백 | [[:space:]] |
6번 | \S | 공백 문자가 아닌 모든 문자 | [^[:space:]] |
3) PERL 정규표현식 연산자 예시
SELECT REGEXP_SUBSTR('abc123', '\d') AS C1,
REGEXP_SUBSTR('abc123', '[[:digit:]]') AS C2,
REGEXP_SUBSTR('123abc', '\D') AS C3,
REGEXP_SUBSTR('123abc', '[^[:digit:]]') AS C4,
REGEXP_SUBSTR('Hello_World123!', '\w') AS C5,
REGEXP_SUBSTR('Hello_World123!', '[[:alnum:]_]') AS C6,
REGEXP_SUBSTR('Hello_World123!', '\W') AS C7,
REGEXP_SUBSTR('Hello_World123!', '[^[:alnum:]]') AS C8,
REGEXP_SUBSTR('Hello World', '\s') AS C9,
REGEXP_SUBSTR('Hello World', '[[:space:]]') AS C10,
REGEXP_SUBSTR('Hello World', '\S') AS C11,
REGEXP_SUBSTR('Hello World', '[^[:space:]]') AS C12
FROM DUAL;C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 | C9 | C10 | C11 | C12 |
1 | 1 | a | a | H | H | ! | ! | H | H |
3. 정규표현식 조건과 함수
1️⃣ REGEXP_LIKE 조건
1) REGEXP_LIKE 함수
- 오라클에서 사용되는 함수
- 문자열이 특정 정규표현식 패턴과 일치하는지 확인하는 데 사용됨
- 주로 SQL 쿼리에서 조건절에 사용되어 문자열이 특정 패턴을 만족하는지 여부에 따라 결과 필터링
2) REGEXP_LIKE 함수의 예
- 특정 패턴을 포함하는 행 찾기
SELECT ENAME, JOB
FROM EMP
WHERE REGEXP_LIKE(ENAME, '^A');ENAME | JOB |
ALLEN | SALESMAN |
ADAMS | CLERK |
- 대소문자를 구분하지 않고 패턴 일치
SELECT ENAME, JOB
FROM EMP
WHERE REGEXP_LIKE(ENAME, 'smith', 'i');ENAME | JOB |
SMITH | CLERK |
- 숫자를 포함하는 행 찾기
SELECT ENAME, JOB, SAL, COMM
FROM EMP
WHERE REGEXP_LIKE(COMM, '\d');ENAME | JOB | SAL | COMM |
ALLEN | SALESMAN | 1600 | 300 |
WARD | SALESMAN | 1250 | 500 |
MARTIN | SALESMAN | 1250 | 1400 |
TURNER | SALESMAN | 1500 | 0 |
- 특정 형식의 패턴 찾기
SELECT LAST_NAME, EMAIL, PHONE
FROM EMPLOYEES
WHERE REGEXP_LIKE(PHONE, '^\d{3}.\d{3}.\d{4}$')
AND ROWNUM <= 5;LAST_NAME | EMAIL | PHONE |
Payne | summer.payne@example.com | 515.123.8181 |
Stephens | rose.stephens@example.com | 515.123.8080 |
Dunn | annabelle.dunn@example.com | 515.123.4444 |
Bailey | tommy.bailey@example.com | 515.123.4567 |
Cooper | blake.cooper@example.com | 515.123.4569 |
- 공백 또는 탭 문자를 포함하는 행 찾기
SELECT PRODUCT_NAME, DESCRIPTION, LIST_PRICE
FROM PRODUCTS
WHERE REGEXP_LIKE(PRODUCT_NAME, '\s')
AND ROWNUM <= 5;PRODUCT_NAME | DESCRIPTION | LIST_PRICE |
Intel Xeon E5-2699 V3 (OEM/Tray) | Speed:2.3GHz,Cores:18,TDP:145W | 3410.46 |
Intel Xeon E5-2697 V3 | Speed:2.6GHz,Cores:14,TDP:145W | 2774.98 |
Intel Xeon E5-2698 V3 (OEM/Tray) | Speed:2.3GHz,Cores:16,TDP:135W | 2660.75 |
Intel Xeon E5-2697 V4 | Speed:2.3GHz,Cores:18,TDP:145W | 2554.99 |
Intel Xeon E5-2685 V3 (OEM/Tray) | Speed:2.6GHz,Cores:12,TDP:120W | 2501.69 |
2️⃣ REGEXP_REPLACE 함수
1) REGEXP_REPLACE 함수
- 오라클에서 제공하는 함수
- 정규표현식을 사용해 문자열에서 특정 패턴을 찾아 다른 문자열로 대체하는 데 사용됨
- 일반적인 REPLACE 함수보다 더 복잡한 패턴 매칭과 교체 작업을 수행할 수 있어 유연한 문자열 조작 가능
2) REGEXP_REPLACE 함수의 예
- 특정 패턴을 다른 문자열로 대체
SELECT REGEXP_REPLACE('123abc456def', '\d', '#') AS RESULT
FROM DUAL;RESULT |
###abc###def |
- 여러 개의 공백을 하나의 공백으로 대체
SELECT REGEXP_REPLACE('Hello World SQL', '\s+', ' ') AS RESULT
FROM DUAL;RESULT |
Hello World SQL |
- 대소문자 구분 없이 문자열 대체
SELECT REGEXP_REPLACE('Hello World', 'world', 'Universe', 1, 0, 'i') AS RESULT
FROM DUAL;RESULT |
Hello Universe |
1 : 검색 시작 위치, 첫째자리부터 검색한다는 의미0 : 대치할 일치 항목의 순서, 모든 값이 일치했을 때라는 조건 의미‘i’ : 대소문자 구분하지 않음- 전화번호 형식 변환
SELECT REGEXP_REPLACE('123-456-7890', '(\d{3})-(\d{3})-(\d{4})', '(\1)-\2-\3') AS RESULT
FROM DUAL;RESULT |
(123) 456-7890 |
\1, \2, \3 : 각각 첫 번째, 두 번째, 세 번째 그룹을 참조- 문자열에서 모든 숫자를 제거
SELECT REGEXP_REPLACE('Address 1234, ZIP 56789', '\d', '') AS RESULT
FROM DUAL;RESULT |
Address , ZIP |
3️⃣ REGEXP_INSTR 함수
1) REGEXP_INSTR 함수
- 오라클에서 제공하는 함수
- 정규표현식을 사용해 문자열에서 특정 패턴이 처음 나타나는 위치를 찾는 데 사용됨
- 일반적인 INSTR 함수와 유사하지만, 정규표현식을 통해 더 복잡한 패턴 매칭을 수행할 수 있음
2) REGEXP_INSTR 함수의 형식
REGEXP_INSTR(
source_string,
pattern, position, occurrence, return_option, match_parameter
)source_string- 검사할 원본 문자열
pattern- 정규표현식 패턴
- 일치하는 패턴의 위치를 찾음
position- (선택 사항)
- 검색을 시작할 위치
- 기본값 : 1
occurrence- (선택 사항)
- 패턴과 일치하는 몇 번째 위치를 찾을 것인지를 지정
return_option- (선택 사항)
- 패턴이 일치하는 위치의 시작점(0) 또는 끝점(1)을 반환할지 지정
- 기본값 : 0 (시작 위치)
match_parameter- (선택 사항)
- 정규표현식의 동작을 제어하는 플래그
- 예)
‘i’를 사용하면 대소문자 구분하지 않음
3) REGEXP_INSTR 함수의 예
- 첫 번째 일치 위치 찾기
SELECT REGEXP_INSTR('오라클SQL Developer', 'SQL') AS RESULT
FROM DUAL;RESULT |
4 |
- 특정 위치에서 검색 시작
SELECT REGEXP_INSTR('SQL SQL SQL', 'SQL', 5) AS RESULT
FROM DUAL;RESULT |
5 |
- 여러 번째 일치 위치 찾기
SELECT REGEXP_INSTR('SQL SQL SQL', 'SQL', 1, 2) AS RESULT
FROM DUAL;RESULT |
5 |
- 대소문자 구분 없이 검색
SELECT REGEXP_INSTR('오라클SQL Developer', 'sql', 1, 1, 0, 'i') AS RESULT
FROM DUAL;RESULT |
4 |
4️⃣ REGEXP_COUNT 함수
1) REGEXP_COUNT 함수
- 오라클에서 제공하는 함수
- 문자열에서 정규표현식을 사용해 특정 패턴이 몇 번 나타나는지 계산하는 데 사용됨
- 데이터 분석 및 검증 작업에서 매우 유용하게 활용
2) REGEXP_COUNT 함수의 형식
REGEXP_COUNT(source_string, pattern, position, match_parameter)source_string- 패턴을 검색할 원본 문자열
pattern- 정규표현식 패턴
- 이 패턴이 문자열에서 몇 번 나타나는지 계산
position- (선택 사항)
- 검색을 시작할 위치
- 기본값 : 1
match_parameter- (선택 사항)
- 정규표현식의 동작을 제어하는 플래그
- 예)
‘i’를 사용하면 대소문자 구분하지 않음
3) REGEXP_COUNT 함수의 예
- 특정 패턴의 출현 횟수 계산
SELECT REGEXP_COUNT('abc123abc456abc', 'abc') AS RESULT
FROM DUAL;RESULT |
3 |
- 숫자 패턴의 출현 횟수 계산
SELECT REGEXP_COUNT('abc123abc456abc789', '\d{3}') AS RESULT
FROM DUAL;RESULT |
3 |
- 특정 위치에서 패턴의 출현 횟수 계산
SELECT REGEXP_COUNT('abc123abc456abc', 'abc', 5) AS RESULT
FROM DUAL;RESULT |
2 |
- 대소문자 구분 없이 패턴의 출현 횟수 계산
SELECT REGEXP_COUNT('OracleSQL Oraclesql', 'oracle', 1, 'i') AS RESULT
FROM DUAL;RESULT |
2 |
Share article