본문 바로가기
데이터베이스(DB)/SQLD

[SQLD 2-2-8] SQL 활용 - 정규 표현식

by 송기동 2024. 6. 17.
728x90

정규 표현식(Regular Expression)

- 문자열의 공통된 규칙을 보다 일반화 하여 표현하는 방법

- 정규 표현식 사용 가능한 문자함수 제공(regexp_replace, regexp_substr, regexp_instr, ...)

  ex) 숫자를 포함하는, 숫자로 시작하는 4 자리, 두번째 자리가 A 인 5 글자

 

정규 표현식 종류


REGEXP_REPLACE

- 정규식 표현을 사용하여 문자열 내의 패턴을 다른 문자열로 대체

 

# 문법

REGEXP_REPLACE(source_string, pattern, replace_string, position, occurrence, match_parameter)

 

 

- source_string : 검색할 문자열

- pattern : 대체할 패턴을 정의하는 정규 표현식

- replace_string : 대체할 문자열 (생략시 문자열 삭제)

- position : 검색을 시작할 위치. 기본값은 1

- occurrence : 대체할 발생 횟수. 기본값은 0이며, 모든 발생을 대체

- match_parameter : 일치 조건을 지정 (예: 'i'는 대소문자 구분 없음).

 

 

# 옵션

- c : 대소를 구분하여 검색

- i : 대소를 구분하지 않고 검색

- m : 패턴을 다중라인으로 선언 가능

 

# 예시

# 모든 공백을 밑줄로 대체
SELECT REGEXP_REPLACE('Hello World, Welcome!', '\s', '_') AS replaced_string
FROM dual;

결과 :
Hello_World,_Welcome!
# 숫자를 문자로 대체
SELECT REGEXP_REPLACE('Phone: 123-456-7890', '\d', '#') AS replaced_string
FROM dual;

결과 :
Phone: ###-###-####

REGEXP_SUBSTR

- 정규식 표현식 사용하여 문자열 내에서 일치하는 부분 문자열을 반환

- 옵션은 REGEXP_REPLACE 와 동일

 

# 문법

REGEXP_SUBSTR(source_string, pattern, position, occurrence, match_parameter)

 

 

- source_string : 검색할 문자열

- pattern : 검색할 패턴을 정의하는 정규 표현식

- position : 검색을 시작할 위치. 기본값은 1

- occurrence : 검색할 발생 횟수. 기본값은 1

- match_parameter : 일치 조건을 지정합니다 (예: 'i'는 대소문자 구분 없음).

 

 

# 예시

# 이메일 주소 추출
SELECT REGEXP_SUBSTR('Contact us at support@example.com for more info.', '\S+@\S+\.\S+') AS email
FROM dual;

결과 :
support@example.com
# 특정 형식의 날짜 추출
SELECT REGEXP_SUBSTR('The event is on 2024-06-13.', '\d{4}-\d{2}-\d{2}') AS date
FROM dual;

결과 :
2024-06-13

REGEXP_INSTR

- 정규 표현식을 사용하여 문자열 내에서 특정 패턴이 처음으로 발생하는 위치를 반환

- 옵션은 REGEXP_SUBSTR 과 동일

 

# 문법

REGEXP_INSTR(source_string, pattern, position, occurrence, return_option, match_parameter)

 

 

- source_string : 검색할 문자열

- pattern : 검색할 패턴을 정의하는 정규 표현식

- position : 검색을 시작할 위치. 기본값은 1

- occurrence : 검색할 발생 횟수. 기본값은 1

- return_option : 0이면 시작 위치를 반환하고, 1이면 종료 위치를 반환. 기본값은 0

- match_parameter : 일치 조건을 지정합니다 (예: 'i'는 대소문자 구분 없음).

 

# 예시

# 문자열에서 특정 단어의 시작 위치 찾기
SELECT REGEXP_INSTR('Hello World, Welcome to the World of SQL', 'World', 1, 1, 0, 'i') AS position
FROM dual;

결과 : 
7

 

# 문자열에서 특정 단어의 두 번째 발생 위치 찾기
SELECT REGEXP_INSTR('Hello World, Welcome to the World of SQL', 'World', 1, 2, 0, 'i') AS position
FROM dual;

결과 : 
28
# 문자열에서 숫자의 위치 찾기
SELECT REGEXP_INSTR('The price is 100 dollars', '\d+', 1, 1, 0) AS position
FROM dual;

결과 : 
13

REGEXP_LIKE

- 정규 표현식을 사용하여 문자열이 특정 패턴과 일치하는지 확인하는 데 사용

- 주로 데이터 검증 및 텍스트 검색에 유용

- 옵션은 REGEXP_REPLACE 와 동일

 

# 문법

REGEXP_LIKE(source_string, pattern, match_parameter)

 

 

- source_string : 검사를 수행할 문자열

- pattern : 검색할 패턴을 정의하는 정규 표현식

- match_parameter : 일치 조건을 지정하는 선택적 매개변수 (예: 'i'는 대소문자 구분 없음)

 

# 예시

# 이메일 주소 형식 검증
SELECT email, 
       CASE 
         WHEN REGEXP_LIKE(email, '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$') THEN 'Valid' 
         ELSE 'Invalid' 
       END AS email_status
FROM (SELECT 'example@example.com' AS email FROM dual
      UNION ALL
      SELECT 'invalid-email.com' AS email FROM dual);

결과 :
| email                | email_status |
|----------------------|--------------|
| example@example.com  | Valid        |
| invalid-email.com    | Invalid      |

 

# 특정 패턴의 전화번호 검증
SELECT phone_number, 
       CASE 
         WHEN REGEXP_LIKE(phone_number, '^\d{3}-\d{3,4}-\d{4}$') THEN 'Valid' 
         ELSE 'Invalid' 
       END AS phone_status
FROM (SELECT '123-456-7890' AS phone_number FROM dual
      UNION ALL
      SELECT '123-45-7890' AS phone_number FROM dual);

결과 :
| phone_number | phone_status |
|--------------|--------------|
| 123-456-7890 | Valid        |
| 123-45-7890  | Invalid      |

REGEXP_COUNT

- 정규 표현식을 사용하여 문자열 내에서 특정 패턴의 발생 횟수를 계산하는 데 사용

 

# 문법

REGEXP_COUNT(source_string, pattern, position, match_parameter)

 

 

- source_string : 검색할 문자열

- pattern : 검색할 패턴을 정의하는 정규 표현식

- position : 검색을 시작할 위치. 기본값은 1

- match_parameter : 일치 조건을 지정하는 선택적 매개변수 (예: 'i'는 대소문자 구분 없음).

 

# 예시

# 문자열에서 특정 단어의 발생 횟수 계산
SELECT REGEXP_COUNT('Hello World, Welcome to the World of SQL', 'World') AS occurrence_count
FROM dual;

결과 :
2

 

# 특정 위치부터 패턴 검색
# 다음 쿼리는 문자열 'ababab'에서 'ab' 패턴이 처음부터가 아닌 3번째 위치부터 몇 번 등장하는지 계산
SELECT REGEXP_COUNT('ababab', 'ab', 3) AS occurrence_count
FROM dual;

결과 :
1
728x90