본문 바로가기

SQL/LeetCode

LeetCode / 1517. Find Users With Valid E-Mails / MySQL / Easy / SUBSTRING_INDEX / REGEX(정규표현식)

728x90

📚문제

출처 : LeetCode(https://leetcode.com/problems/find-users-with-valid-e-mails/)


📝풀이

# Write your MySQL query statement below
# 내 제출 - 오답
SELECT *
FROM Users
WHERE SUBSTRING_INDEX(mail,'@',1) REGEXP '^[A-Za-z][A-Za-z0-9._-]+$'
  AND SUBSTRING_INDEX(mail,'@',-1) = 'leetcode.com'

정규표현식으로 풀어야할 것 같아서

구글링하여 풀어봤다

근데 테스트 케이스까진 맞는데

제출에서 틀린다

답과 대조해봤는데 어디서 왜 틀린지가 안나온다..생략된듯

 

+ 그래도 mysql에서 split 기능을 하는

SUBSTRING_INDEX 함수를 배웠다

SUBSTRING_INDEX(col,'구분자',1)

해당 열을 지정하고(col)

문자열 내에서 어떤 구분자를 나눌 지 설정한 뒤('구분자')

나누어진 문자열들 중에서 몇번째 인덱스에 있는 것을 가져올 건지 설정

아래 예시 확인

참고 링크 : https://daily-struggle.tistory.com/48

만약 중간 문자열을 가져오고 싶다면 SUBSTRING_INDEX 함수로 한번 더 감싸줘야한다

SUBSTRING_INDEX(SUBSTRING_INDEX('하나-둘-셋' '-', -2), '-', 1)

아무튼 오답이기 때문에

조금 더 간단한 풀이 참고

📌최종 코드

# Write your MySQL query statement below
SELECT *
FROM Users
WHERE mail REGEXP '^[A-Za-z][A-Za-z0-9._-]*leetcode[.]com+$'
# WHERE mail REGEXP '^[A-Za-z][A-Za-z0-9._-]*leetcode\\.com+$'

 

코드설명

^[A-Za-Z] : ^는 문자열의 시작을 알리고 지정하지 않을경우 모든 문자열 . 여기서는 문자열(letter)로 시작해야한다는 의미

[A-Za-z0-9._-]* : *는 반복여부 표현. *앞의 문자가 0번 또는 그 이상 반복됨. 여기서는 문자열,숫자,._-만 나온다는 의미

leetcode[.]com+$ : $는 문자열의 끝을 표현 지정하지 않을 경우 모든 문자열. 여기서는 leetcode.com으로 끝난다는 의미

                                []은 문자 클래스를 나타내며 해당 안에 문자열과 일치하는 경우

                               여기서 leetcode[.]com은 .(마침표)문자 하나와 그대로 일치하는 경우를 의미

+ : 반복여부 표현. *앞의 문자가 적어도 1번은 나와야함. 여기서 @leetcode.com은 반드시 나와야 하기때문에 *가 아닌 +

leetcode\\.com : 이스케이프 표현. .(마침표)를 문자 그대로 사용하기 위해서 \(역슬래시)기호 사용.

                          하지만 이때 \(역슬래시) 기호 또한 문자열로 봐야하므로 \(역슬래시) 기호 한 번 더 사용하여 총 2회 사용

 

참고 링크 : https://hamait.tistory.com/342

 

728x90