유효한 이메일을 찾는 문제로, 유효한 이메일의 기준은 아래와 같다.
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 |