SQL

[Leetcode] 특정 문자열 처리 함수 REGEXP

DAdiary 2024. 6. 10. 14:19

https://leetcode.com/problems/find-users-with-valid-e-mails/description/?envType=study-plan-v2&envId=top-sql-50

 

유효한 이메일을 찾는 문제로, 유효한 이메일의 기준은 아래와 같다.

The prefix name is a string that may contain letters (upper or lower case), digits, underscore '_', period '.', and/or dash '-'.
이메일 아이디는 글자, 숫자, '_', '.', '-'를 포함할 수 있다.

The prefix name must start with a letter.
이메일은 반드시 알파벳으로 시작해야 한다.

The domain is '@leetcode.com'.
도메인은 @leetcode.com만 인정

 

[정답]

/*
^ = Anchor the regex pattern to match from the start of the string
[a-zA-Z] = means mail should start from small or capital letter
[a-zA-Z0-9_.-] = after that any letter or number or _ or . or -
@leetcode = after that combine with  @leetcode
[.] = must come . after @leetcode
com = then com
$ = Anchor the regex pattern to match until the end of the string
*/

SELECT user_id, name, mail
FROM Users
WHERE mail REGEXP '^[A-Za-z][A-Za-z0-9_.-]*@leetcode[.]com$'
;

 

 


Like는 1개의 문자를 찾을 때 유용하게 쓰이지만 조건이 2개 이상 넘어가면 쿼리를 일일히 작성해줘야 해서 번거롭고 쿼리도 깔끔하지가 않다.

그 때 쓸 수 있는게 바로 REGEXP이다.

 

REGEXP

REGEXP는 정규표현식(regular expression)으로 특정한 조건의 텍스트를 판별할 때 사용한다.

매우 복잡해보이지만 규칙만 알면 쉽기도 한 정규표현식.

코딩테스트 틀린 김에 같이 정리해두면 나중에 편할 것 같아 정리해두는 문자열 표현식.

 

 

1. Matching

.
문자 하나
"..."
문자열의 길이가 세 글자 이상인 것을 검색
|
or(또는)
|로 구분된 문자에 해당하는 문자열을 검색
"data1|data2"
data1 또는 data2에 해당하는 문자열을 검색
[]
괄호 내 나열된 패턴에 해당되는 문자열을 검색
"[123]d"
대상 문자열에서 '1d' 또는 '2d' 또는 '3d'인 문자열을 검색
^
시작하는 문자열 검색
"^표준"
"^[A-Za-z]"
대상 문자열에서 '표준'으로 시작하는 문자열을 검색
대상 문자열에서 대문자/소문자로 시작하는 문자열 검색
$
끝나는 문자열 검색
"사자$"
대상 문자열에서 '사자'으로 끝나는 문자열을 검색

 

2. Number Limit

*
0회 이상 나타나는 문자
"a*"
'a'가 0번 이상 등장하는 문자열을 검색
+
1회 이상 나타나는 문자
"일+"
'일'이 1번 이상 등장하는 문자열을 검색 ('한일', '금일', '명일'..등)
{m,n}
m회 이상 n회 이하 반복되는 문자
"부{1,2}"
'부'가 1회 이상 2회 이하 반복하는 문자열을 검색(부슬부슬...)
?
0~1회 나타나는 문자
"[가나다]?"
'가'또는 '나'또는 '다' 가 0~1회 등장하는 문자열을 검색
('가지마', '나라', '다람쥐'..등)

 

3. String Group

[A-z] 또는 {:alpha:] 또는 \a
알파벳 대문자 또는 소문자인 문자열을 검색
"[A-z]+"
대상 문자열에서 알파벳이 한 개 이상인 문자열을 검색
[0-9] 또는 [:digit:] 또는 \d
숫자인 문자열을 찾음
"^[0-9]+"
한 개 이상의 숫자로 시작하는 문자열을 검색

 

4. Not

[^문자]
괄호 안의 문자를 포함하지 않은 문자열을 검색
"[^강아지]"
'강' 또는 '아' 또는 '지'를 포함하지 않은 문자열을 검색
('한', '이스크림', '안압'... 모두 제외)

# '강' 또는 '아' 또는 '지'가 포함된 문자열을 찾고 싶을 때

#정규표현식 사용하지 않는 경우
SELECT *
FROM TBL
WHERE data LIKE '%강%'
OR data LIKE '%아%'
OR data LIKE '%지%'

#정규표현식 사용하는 경우
SELECT *
FROM TBL
WHERE data REGEXP '강|아|지'

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

# '과자' 혹은 '사탕'으로 끝나는 문자열을 찾고 싶을 때

# 정규표현식 사용하지 않는 경우
SELECT *
FROM TBL
WHERE data LIKE '%과자' OR '%사탕'

# 정규표현식 사용하는 경우
SELECT *
FROM TBL
WHERE data REGEXP('과자^|사탕^')

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

# 길이 8글자인 문자열 중 3번째 자리부터 abc를 포함하는 문자열을
찾고싶을 때

# 정규표현식 사용하지 않는 경우
SELECT *
FROM TBL
WHERE CHAR_LENGTH(data) = 8 AND SUBSTRING(data,2,3) = 'abc';

# 정규표현식을 사용하는 경우
SELECT *
FROM TBL
WHERE data REGEXP('^.abc...$')

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

# 텍스트와 숫자가 혼합된 문자열에서 숫자만 찾고 싶을 때

SELECT *
FROM TBL
WHERE data REGEXP('^[0-9]+$')
--OR data REGEXP('^\d$')
--OR data REGEXP('^[:digit:]$')

'SQL' 카테고리의 다른 글

[Leetcode] 중복ID 제거(DELETE)  (0) 2024.06.08
[Leetcode] IFNULL, JOIN 다중조건  (0) 2024.05.25
[Leetcode] SUM/AVG() OVER (ORDER BY ~ ROWS ~)  (0) 2024.05.21
[Leetcode] LEAD, LAG  (0) 2024.05.21
[프로그래머스] SQL 반복문, WITH RECURSIVE  (0) 2024.05.21