On a couch

[TIL] 정규표현식 써 봤다 본문

혼자 발버둥/TIL

[TIL] 정규표현식 써 봤다

couch 2022. 8. 4. 10:42

회고

그동안 야금야금 눈팅만 하던 정규표현식을 테스트자동화 공부하며 드디어 한 번 써 봤다.

테스트해야 할 경우의 수가 무려 8가지x2가지 = 16가지인데,

if문 안에 그렇게 길고 지저분한 코드를 넣고 싶지가 않았다 ㅠ

  // Discover 카드번호는 항상 6011, 65, 644에서 649까지의 숫자로 시작하고 16 또는 19자리의 숫자입니다.
  let discoverPrefix = /^['6011''65''644''645''646''647''648''649']/
  let discoverLength = /\d{16,19}/
  if(discoverPrefix.test(cardNumber) && discoverLength.test(cardNumber)){
    return "Discover"
  }

원하는 표현식은 '6011' 등의 문자열들 중 하나로 시작하는 것이었다.

/^문자열/  이렇게 쓰면 해당 문자열로 시작하는 것을 뜻하고

/[abc]/  이렇게 쓰면 a나 b나 c중 하나가 일치하는 것을 뜻한대서 섞어 써 봤는데,

'6011'을 하나의 string으로 인식하는 게 아니라 ' 6 0 1 1 ' 이렇게 다섯 개의 char로 인식하더라 ㅇ<-<

if(/^(?:6011\d{12}(\d{3})?)$|(?:65\d{14}(\d{3})?)$|(?:64[4-9]\d{13}(\d{3})?)$/.test(cardNumber)) {
      return 'Discover'
  }

마침 오늘 문제를 정규표현식으로 푼 분이 계셔서 코드를 보니

1. 시작부분을 6011, 65, 055-049의 3가지로 케이스를 나누시고

2. 괄호로 감싸 string으로 만든 뒤

3. 각각의 시작부분 뒤에 12자리 혹은 15자리 수를 붙여 길이를 맞추시고

4. 이걸 | 기호로 연결해서 셋 중 하나면 통과되도록 하셨다

 

첫 시도는 엉망이었지만 그래도 드디어 어떻게 쓰는지 대략 이해했고, 막상 써 보니 생각만큼 아주 외계어는 아니었다.

특히 / / 와 \ 때문에 너무 정신사나워 보였는데, 슬래시가 문자열의 따옴표나 템플릿리터럴의 백틱 같은 역할이란 걸 깨닫고 나니 생각보다 심플하다.

작성할 때만 정신 똑바로 차리고 잘 적어 두면 이런저런 복잡한 검사를 한 번에 처리하는 격이라 마음에 든다.

 


참고자료

1. 각 문자에 대한 정리가 되어있어 바로 따라하기 좋았던 글

[자바스크립트] 정규표현식(Regular Expression) 기초/기본 쉽고 상세한 사용 방법 정리(샘플 예제 코드)

https://curryyou.tistory.com/234

 

2. 모던자바스크립트 정규표현식 문서

https://ko.javascript.info/regular-expressions

 

3. 테스트 사이트 모음

[Web] 정규표현식 테스트 사이트 모음 총정리

https://coding-factory.tistory.com/819