최근 모 은행 코테에서 sql 문제로 정규식 문제를 내서 화제가 되었다.
SELECT email
FROM your_table_name
WHERE email REGEXP '^[a-zA-Z0-9]+@[a-zA-Z]+\.com$';
자소설닷컴 복기본이라 100% 정확한 것은 아니다.
그리고 저거 못 맞춰도 다른 알고리즘에서 변별력을 준 것 같다. 저거 못 풀어도 면접 간다.
근데 또 sqlp 있는 사람도 저건 예상 못했다고 하는데... 좀 심한거 아닌가 ㅜ
언제 저런 괴랄한 문제가 또 나올수 있지 않을까 싶어 정리한다.
정규식이란?
프로그래밍에서 문자열을 다룰 때, 문자열의 일정한 패턴을 표현하는 일종의 형식 언어를 말한다. 정규 표현식이라고도 부르며, 보통 RegEx 혹은 RegExp라 많이 쓴다.
내가 쓴 정규식이 잘 쓴 정규식인지는 아래 사이트에서 테스트할 수 있다고 한다.
RegExr: Learn, Build, & Test RegEx
RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).
regexr.com
우선 위의 예제를 기준으로 예제에 포함된 정규식에 쓰인 문자들을 먼저 알아보자.
^
문자열의 시작을 의미한다
[a-zA-Z0-9]+
알파벳 소문자, 대문자, 그리고 숫자로 이루어진 문자들이 한 번 이상(+) 나와야 하는 것을 의미한다.
@
문자 그대로 @ 기호가 있어야 함을 의미한다.
\.com
.com이 나와줘야 한다.
$
문자열의 끝을 나타낸다. 이메일 주소가 .com으로 끝나야 함을 의미한다.
여기서 변형을 가해서, com 말고도 다른 도메인이 들어와도 되게 바꿔본다.
SELECT email
FROM your_table_name
WHERE email REGEXP '^[a-zA-Z0-9]+@[a-zA-Z]+\.[a-zA-Z]{2,}$';
[a-zA-Z]{2,}
알파벳으로 이루어진 문자열이 2자 이상 나와줘야 함을 의미한다.
이를 정규식에서는 수량자라고 정의한다. 아래와 같이 있다.
-
{n} : 정확히 n번 반복할 때 일치한다.
-
{n,} : n번 이상 반복할 때 일치한다.
-
{n,m} : n번에서 m번 안으로 반복할 때 일치한다.
이렇게 변형하면 .com이 아니더라도 다양한 도메인 확장자를 포함한 이메일 주소를 허용하게 된다.
기존에는 활용하지 못했던 example@domain.com, user123@site.org, test@company.co.kr와 같은 이메일 주소를 활용할 수 있게 된다.
유의사항
각 언어에서 지원하는 정규식 엔진은 그 구현이 제각각 다르기 때문에 항상 정규식을 검증한 다음 사용해야 한다.