ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 정규식 때리기
    Today I Learned 2022. 8. 30. 23:58

     

    11주차 퀘스트 과제 깐깐ㅎ... 아니 빈틈없는 회원가입 과제에서 만족시켜야 할 요구사항들 중에는 다음과 같은 내용이 있다.

     

     

    • 이메일 주소의 형식이 맞지 않는 경우 회원가입 처리하지 않고 에러를 발생시킵니다.
      • 이메일 주소 형식: local-part@domain (총 30글자 이하)
    • 비밀번호 형식이 맞지 않는 경우 회원가입 처리하지 않고 에러를 발생시킵니다.
      • 비밀번호 형식: 8글자 이상의 영문 대소문자, 숫자, 특수문자만 입력 가능, 영문 대소문자와 숫자를 필수적으로 혼용

     

     

    요구사항을 보니 이전에 파보려다가 관뒀던 정규식을 다시 보기 시작해야 하겠구나 싶은 생각이 들었다. 이월 3주차 퀘스트 과제였던 깐깐한 계산기 과제를 풀 때 정규식을 한 번 활용해본 적이 있었다. 문자열이 특정 조건을 만족하는지를 하나의 구문에서 표현할 수 있다는 점은 매력적으로 느껴졌지만... 정규식으로 표현한 식이 언뜻 보기에는 너무나도 복잡해 보이는지라 다시 써볼 생각은 쉽게 못하고 있었다.

     

    '에라 모르겠다 이번 기회에 한번 다시 써보지 뭐!' 싶은 생각으로 무작정 정규식을 작성해보기 시작했다.

     

     

    먼저 이메일 주소 형식을 일치시키기 위해 어떤 조건을 만족해야 하는지를 생각해보았다. 다음과 같은 과정으로 정규식이 가져야 할 조건을 구상했다.

     

    • 로컬 파트는 계정명을 나타내는 것일 것이다. 그렇다면 "영문 소문자, 숫자로 구성된 문자열"의 형태일 것이다.

    • 로컬 파트와 도메인 주소는 "@"로 구분된다.

    • 도메인 주소는 "영문 소문자, 숫자로 구성된 문자열"과 "영문 소문자로 구성된 문자열"이 "."으로 구분되는 형태이다. (naver.com 처럼)

    • 그렇다면 정규식 패턴은 "영문 소문자, 숫자로 구성된 문자열" + "@" + "영문 소문자, 숫자로 구성된 문자열" + "." + "영문 소문자로 구성된 문자열"의 형태를 취하도록 할 수 있을 것 같다.

     

    구상한 내용을 토대로 다음과 같이 첫 번째로 정규식 작성을 시도했다.

     

    String emailWithNoAtSign = "hsjkdss228.naver.com"
    String emailWithNoPeriod = "hsjkdss228@naver@com"
    
    if (!emailWithNoAtSign.matches("[0-9a-zA-Z][@][0-9a-zA-Z][.][a-zA-Z]")) {
          throw new WrongEmailFormatException();
    }

     

     

    저 정규식을 사용했을 때에는 조건을 통과하지 못했다.

     

    이때까지 정규식을 사용하면서 답답했던 부분이 몇 가지 있었다. 문자열의 양식이 나뉘는 부분을 어떻게 구분해야 하는지 알기 어려웠고, 특수 문자들이 나타내는 의미가 너무 다양해서 뭘 써야 할지 모르겠는 등 사용법 자체에 접근하기가 쉽지 않았다.

     

    문득 '정규식에 대해서도 다른 인터프리터처럼 동작을 검증할 수 있는 도구가 없을까...' 싶은 생각이 들어서 정규식을 검증할 수 있는 도구를 인터넷에 검색했다. 다행히 정규식에 대한 검증을 할 수 있는 기능을 제공하는 웹 사이트가 있어 들어가보았다.

     

    계속...

     

    더 공부해볼 블로그: https://elvanov.com/2388

     

    정규식 관련 코딩테스트: https://school.programmers.co.kr/learn/courses/30/lessons/72410

     

     

     

     

     

    댓글

Designed by Tistory.