SQL | 정규 표현식을 이용한 검색, REGEXP

ja_efan·2024년 1월 26일
0

SQL

목록 보기
3/5
post-thumbnail

REGEXP?


REGEXP는 Regular Expression(정규 표현식)을 이용한 검색을 제공한다.

REGEXP는 LIKE보다 다양한 검색을 할 수 있도록 도와준다.

REGEXP를 사용하면 SQL에서 정규표현식을 사용하여 기본 연산자보다 복잡한 문자열 조건을 이용하여 데이터를 검색할 수 있다.

Regular Expression(정규표현식)이란?


정규표현식은 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어이다.

문자열을 처리하는 방법 중의 하나로, 특정한 조건의 문자를 ‘검색’하거나 ‘치환’하는 과정을 매우 간편하게 처리할 수 있도록 해주는 수단이다.

정규표현식은 pattern을 사용해서 문자열을 처리한다.

찾을 대상문자열에서 정규표현식을 사용해 해당 pattern과 일치하는 문자열을 검색하는 것이다.

pattern과 일치하는 문자열을 찾은 이후 추출하거나 치환할 수 있다.

Pattern 종류


Matching

Pattern기능예시설명
.문자 하나“…”문자열의 길이가 세 글자 이상인 것을 찾음.
OR,(수직선)으로 구분된 문자에 해당하는 문자열을 찾음.
[][]안에 나열된 패턴에 해당하는 문자열을 찾음.“[123]d”대상 문자열에서 “1d” 또는 “2d” 또는 “3d”인 문자열을 찾음.
^시작하는 문자열을 찾음.“^Hi”대상 문자열에서 “Hi”으로 시작하는 문자열을 찾음.
$끝나는 문자열을 찾음.“bye$”대상 문자열에서 “bye”로 끝나는 문자열을 찾음.

Numbers Limit

Pattern기능예시설명
*0회 이상 나타나는 문자“a*”‘a’가 0번 이상 등장하는 문자열을 찾음. ‘b’, ‘a’, “aa” 모두 해당.
+1회 이상 나타나는 문자“b+”‘b’가 1번 이상 등장하는 문자열을 찾음. “bye”, “bob” 모두 해당.
{m,n}m회 이상 n회 이하 반복되는 문자“c{1,3}”‘c’가 1회 이상 2회 이하 반복되는 문자열을 찾음. “coke”, “cocacola” 모두 해당.
?0 또는 1회 나타나는 문자“[abc]?”‘a’ 또는 ‘b’ 또는 ‘c’가 0~1회 등장하는 문자열을 찾음. “apple”, “bag”, ‘dog’ 모두 해당.

String Group

Pattern기능예시설명
[A-z] 또는 [:alpha:] 또는 \a알파벳 대문자 또는 소문자인 문자열을 찾음.“[A-z]+”대상 문자열에서 알파벳이 한 개 이상인 문자열을 찾음.
[0-9] 또는 [:digit:] 또는 \d숫자인 문자열을 찾음.“^[0-9]+”대상 문자열에서 한개 이상의 숫자로 시작하는 문자열을 찾음

Not

Pattern기능예시설명
[^문자][]안의 문자를 포함하지 않는 문자열을 찾음.“[^abc]”‘a’ 또는 ‘b’ 또는 ’c’를 포함하지 않는 문자열을 찾음. “cat”, “bye”, “coke” 모두 제외 됨.

REGEXP 사용 예제

# 'a' 또는 'b' 또는 'c'가 포함된 문자열을 찾고 싶을 때

# 정규표현식을 사용하지 않을 때 
SELECT * 
FROM [table_name]
WHERE [col_name] like "%a%"
OR [col_name] like "%b%"
OR [col_name] like "%c%";

# 정규표현식을 사용할 때
SELECT * 
FROM [table_name]
WHERE [col_name] REGEXP "a|b|c";

# "hi" 또는 "hello"로 시작하는 문자열을 찾고 싶을 때

# 정규표현식을 사용하지 않을 때
SELECT * 
FROM [table_name]
WHERE [col_name] like "hi%" 
OR [col_name] like "hello%";

# 정규표현식을 사용할 때
SELECT * 
FROM [table_name]
WHERE [col_name] REGEXP "^hi|^hello";

-------------------------------------------------------
-------------------------------------------------------

# 길이가 5글자인 문자열 중 2번째 자리부터 ab를 포함하는 문자열을 찾고 싶을 때

# 정규표현식을 사용하지 않을 때
SELECT * 
FROM [table_name]
WHERE CHAR_LENGTH([col_name])=7 AND SUBSTRING([col_name],2,2)="ab";

# 정규표현식을 사용할 때
SELECT *
FROM [table_name]
WHERE [col_name] REGEXP "^.ab..$";

-------------------------------------------------------
-------------------------------------------------------

# 텍스트와 숫자가 섞여 있는 문자열에서 숫자로만 이루어진 문자열을 찾고 싶을 때

# 정규표현식을 사용하지 않을 때
SELECT * 
FROM [table_name]
WHERE [col_name] LIKE ????????????

# 정규표현식을 사용할 때
SELECT * 
FROM [table_name]
WHERE [col_name] REGEXP "^[0-9]+$" 
-- OR [col_name] REGEXP "^[:digit:]+$" 
-- OR [col_name] REGEXP "^\d+$" 

주의사항


정규표현식 검색을 이용할 때 절대 사용자에게 정규식 기능을 제공해서는 안된다. 각종 오류를 유발할 수 있고 SQL Injection에 취약해지기 때문에, 정규표현식의 검색은 개발자가 미리 정한 테두리 안에서 행해져야 한다.



참고
https://velog.io/@gillog/MySQL-REGEXPRegular-Expression정규-표현식
https://dev.mysql.com/doc/refman/8.0/en/regexp.html

profile
이것저것.

0개의 댓글