Regular Expression (a.k.a Regex) 을 부셔보자

momo
6 min readJul 24, 2022

지난주.. 열일 도중 동료 개발자 분이 저에게 물었습니다.

‘ OO님 정규식좀 치시나요? ’

대기업 코테 준비기간에 다져진 정규식 짬바로 ‘아 당연하죠’ 를 외쳤는데..

명확하게 이러한 기능이 필요하다는 시점에서 , 금방 구현이 될줄 알았던 정규식은 좀처럼 되지않았고.. 다른 일에 치여 결국 도움을 못 드린채로.. 이번주 포스팅의 주제를 정규식으로 해보자! 라고 마음먹게 되었죠..

그래서 오늘은 정규식을 정리해보고, 동료 개발자가 부탁했던 정규식도 세워 뿌듯하게 마무리해볼까 합니다! 현업에서도 알아두면 매우매우 유용하기 때문에 디테일한 부분은 구글링을 하더라도 이해는 반드시 하도록 넘어가자구요!! 고럼 시작하시죵

흔히 정규식은 스트링 타입의 텍스트의 유효성 검사에 사용되는데요. id, pwd, url, phoneNumber 등등 필요성에 따라 매우 다양하게 활용될 수 있습니다.

패턴을 이해하자!

정규 표현식이 어려운 이유는 난해한 패턴에 대한 러닝커브일텐데요. 개념을 이해하면 그렇게 어렵지않으니 쓱 살펴보시죠!

4가지로 정리해 살펴보시죠!

그전에 라이브로 regex를 코딩할 수 있는데 참고 사이트 링크 걸어두도록 할게요!

일단 flag에 대해선 설명하지 않겠습니다! 오직 패턴으로 부수는 포스팅으로 👊🏻

REGEX

  1. /패턴에 string | string/ 을 입력하면 or 연산자로 해당 스트링을 찾기 용이합니다
  2. /(string | string) | (string)/ 소괄호를 이용한 그룹화
    /gr(e|a)y/ : gr로 시작하며 e 또는 a가 포함되면서 y로 끝나는 패턴
    묶이는 상태에서 (:? string | string) 을 하게되면 패턴은 유효하지만 그룹화에서 제외도 가능합니다.
  3. [] pattern(해당하는 모든 문자열 집합체를 지정하는 개념)
    대괄호 안의 모든 문자열에 대해 하나라도 만족하는 무언가를 찾는 패턴으로 이해.
    /[a-f]/ : a ~ f 까지의 패턴
    /[a-z]/ : a ~ z까지의 패턴
    /[a-zA-Z0–9]/ : a~z A~Z 0~9 까지의 패턴
    ^(NOT SIGN) 도 유용하게 적용될 수 있겠습니다.
    /[^a-f]/ : a~f가 아닌 스트링에 대한 패턴
    /[^a-z]/ : a~z가 아닌 스트링에 대한 패턴
    /^[a-zA-Z0–9]/ : a-z & A-Z & 0–9 가 아닌 스트링에 대한 패턴
  4. ?, *, + pattern
    있거나 없거나의 패턴
    /gra?y/ : ‘gr’ + ‘a’가 있거나 없거나 + ‘y’ 의 패턴 (있다면 1개만) zero || one
    /gra*y/ : ‘gr’ + ‘a’가 있거나 없거나 많거나+ ‘y’ 의 패턴 zero || more
    /gra+y/ : ‘gr’ + ‘a’가 있거나 많거나+ ‘y’ 의 패턴 one || more
  5. {number} pattern
    {n} : n번 반복
    {min,}: 최소 n번 반복
    {min,max}: 최소, 최대 n번 반복
  6. boundary pattern
    \b : 단어 경계
    \B: \b의 반대의 개념
    ^: 문장의 시작
    $: 문장의 끝
  7. Character classes
    \ : 특수 문자가 아닌 문자 (\. , \?)
    . : 줄바꿈 제외 글자
    \d : digit 숫자
    \D : digit 숫자 아님
    \w : word 문자
    \W: word 문자 아님
    \s: space 공백
    \S: space 공백 아님

정리하면서 보니 역시 한번씩 리마인드 해줄 필요성을 또 한번 느끼네요 ㅎㅎ

지난 주 동료분이 이야기하셨던 패턴을 이를 맞춰 한번 만들어보고자 합니다.
요청은 이러했습니다.

‘ 닉네임에 패턴을 적용하고 싶은데, 공백은 하나가능하며 총 30자까지 커버하고자 합니다. 어떻게 사용하면 좋을까요? ’

정규식을 사용하는 핵심은, 관련된 값이 아닌 경우 false 혹은 null을 return하여 유효성을 판별하기 위함인데요. 이를 위해 다음과 같이 작성해 보았습니다.

/^\w+ ?\w+$/g

해당 정규식의 풀이는 다음과 같습니다.

1. 시작지점은 언더바를 포함한 문자열이 1개이상 존재해야하며,

2. 이후 공백은 없거나 1개이상 존재해야한다. (여기서 \s를 사용하지 않은 이유는 \s 옵션은 Tab을 포함하기 때문입니다.)

3. 이후 끝나는시점 $ 역시 언더바를 포함한 문자열(alphabetic, underbar)이 1개이상 존재해야한다.

정도로 되겠습니다.

패턴을 적용해보자!

예시를 보면 너무 잘 적용된 것을 알 수 있죠?
이제 마지막으로 글자수 제한 옵션을 살펴보도록 하죠.

이와 관련해서 많은 레퍼런스를 찾아보고 코드도 작성해보았는데,

결과적으로 패턴{min,max}로 글자수를 파악하고자하면 글자수가 아닌 패턴의 반복 수로 인식되어 조건이 많은 경우 글자수 카운트가 어렵다고 판단되었습니다.

{1,30}을 패턴반복수로 인식해 적용이 되지 않음을 알 수 있었어요.

따라서 이렇게 공백을 포함해 패턴 자체에 크게 3부분 (글자, 공백, 글자)로 포함되는 부분은 true false로 판별하되, 이후 참인 경우 전체 글자수를 한번 더 판별하는 식으로 코드를 작성하면 해결할 수 있을 것 같습니다.

  • 추가로 한국어를 포함한 다국어의 경우 \w 옵션은 적용되지 않습니다.

따라서 \w옵션 대신 좀더 명확히 작성하는 편이 좋을 것 같네요.

ex)
/^[a-zA-Z0–9가-힇ㄱ-ㅎㅏ-ㅣぁ-ゔァ-ヴー々〆〤一-龥\w]+ ?[a-zA-Z0–9가-힇ㄱ-ㅎㅏ-ㅣぁ-ゔァ-ヴー々〆〤一-龥\w]*$/g

최종 결과:

와! 미션클리어!

오늘은 정규식에 대해 알아보았는데요. 정리하면서 공부가 많이 되어 기분이 좋네요!

다들 오늘도 행코하시고 이 포스팅을 동료개발자인 갱스터에게 받치겠숩니다..

굳나잇!!!

--

--