REGEXP는 Regular Expression(정규 표현식)을 이용한 검색을 제공한다.
REGEXP는 LIKE보다 다양한 검색을 할 수 있도록 도와준다.
REGEXP를 사용하면 SQL에서 정규표현식을 사용하여 기본 연산자보다 복잡한 문자열 조건을 이용하여 데이터를 검색할 수 있다.
정규표현식은 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어이다.
문자열을 처리하는 방법 중의 하나로, 특정한 조건의 문자를 ‘검색’하거나 ‘치환’하는 과정을 매우 간편하게 처리할 수 있도록 해주는 수단이다.
정규표현식은 pattern을 사용해서 문자열을 처리한다.
찾을 대상문자열에서 정규표현식을 사용해 해당 pattern과 일치하는 문자열을 검색하는 것이다.
pattern과 일치하는 문자열을 찾은 이후 추출하거나 치환할 수 있다.
Pattern | 기능 | 예시 | 설명 |
---|---|---|---|
. | 문자 하나 | “…” | 문자열의 길이가 세 글자 이상인 것을 찾음. |
OR, | (수직선)으로 구분된 문자에 해당하는 문자열을 찾음. | ||
[] | []안에 나열된 패턴에 해당하는 문자열을 찾음. | “[123]d” | 대상 문자열에서 “1d” 또는 “2d” 또는 “3d”인 문자열을 찾음. |
^ | 시작하는 문자열을 찾음. | “^Hi” | 대상 문자열에서 “Hi”으로 시작하는 문자열을 찾음. |
$ | 끝나는 문자열을 찾음. | “bye$” | 대상 문자열에서 “bye”로 끝나는 문자열을 찾음. |
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’ 모두 해당. |
Pattern | 기능 | 예시 | 설명 |
---|---|---|---|
[A-z] 또는 [:alpha:] 또는 \a | 알파벳 대문자 또는 소문자인 문자열을 찾음. | “[A-z]+” | 대상 문자열에서 알파벳이 한 개 이상인 문자열을 찾음. |
[0-9] 또는 [:digit:] 또는 \d | 숫자인 문자열을 찾음. | “^[0-9]+” | 대상 문자열에서 한개 이상의 숫자로 시작하는 문자열을 찾음 |
Pattern | 기능 | 예시 | 설명 |
---|---|---|---|
[^문자] | []안의 문자를 포함하지 않는 문자열을 찾음. | “[^abc]” | ‘a’ 또는 ‘b’ 또는 ’c’를 포함하지 않는 문자열을 찾음. “cat”, “bye”, “coke” 모두 제외 됨. |
# '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