Sungtt

RegExp 정규표현식 해석해보기 [비밀번호] 본문

JavaScript

RegExp 정규표현식 해석해보기 [비밀번호]

sungtt 2022. 4. 13. 09:56

개요

비밀번호가 주어진 양식에 맞는지 체크하기위한 정규표현식을 사용한다.

완성되있는 코드가 어떤 원리로 작동하는지 분석한다.

 

주어진 양식

영문,특수문자,숫자가 포함된 최소 8글자 최대 25글자여야 합니다.

const passwordRegex = /^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-])(?=.*[0-9]).{8,25}$/;

 

 

 

분석

제일 바깥엔 정규표현식 리터럴인 슬래시( / )로 감싸져있다.

그리고 괄호가 크게 3개로 나뉘어져고 안에 문자열을 보아

각 영문,특수문자,숫자에 대한 패턴 검색임을 추측할 수 있다.

정규표현식에 나온 각 특수문자에 대한 기능을 알아보자.

 

특수문자 예시 설명
소괄호 () a(b)c 전체 패턴을 검색한 후에 괄호안에 명시된 문자열을 저장해준다("abc"를 찾으면 b를 저장)
중괄호 {} {n} 앞의 문자가 정확히 n번 나타나는 경우를 검색함
n은 반드시 양의정수이어야 한다.
중괄호와 쉼표 { , } {n,m} 앞의 문자가 최소 m번 이상 최대 n번 이하로 나타나는 경우를 검색함. 반드시 양의 정수이어야 한다.
대괄호 [] [abc] 대괄호안에 명시된 문자를 검색한다.
대괄호와 하이픈 [ - ] [0-9] 대괄호안에 명시된 숫자를 검색한다.
캐럿 ^ ^a 단어의 맨 앞에 위치한 해당 패턴만을 검색함
달러샤인 $ a$ 단어의 맨 뒤에 위치한 해당 패턴만을 검색함
아스테리스크 * n* 바로 앞의 문자가 0번 이상 나타나는 경우를 검색함
물음표 ? n? 바로 앞의 문자가 0번 또는 1번만 나타나는 경우를 검색함
물음표와 등호 ?= ?=
(?=n)
긍정형 전방탐색이라고 한다.
패턴과 일치하지만 값으로 리턴하지않는 패턴 검색이다.
(n이 들어간 문자열을 찾지만 n을 리턴하진않는다.)
피리어드 .  . 모든 문자열(단 줄바꿈 X)

 

 

(?=.*[a-zA-Z])

모든문자열(.)중에 0번 이상 반복되는(*)  영문이 들어간것을 검색[a-zA-Z]하고,

반환하지는 않는다(?=) 

 

^가 앞에있고, 괄호 3개뒤에 .이 있기때문에 모든문자열에 3개의 그룹패턴이 있어야만 일치한다는 의미다.

즉 모든 문자열에 3개그룹의 패턴을 검색하여 일치시킨다!

그리고 그중에서  {8,25}$ 모든문자열의 끝에서 최소 8에서 25개의 문자로 이루어진것을 일치시킨다!

 

끝에 $가 없으면 25개가 넘어가도 25개까지의 문자는 일치시키기때문에

비밀번호에 30자를 입력해도 일치한다고 인식합니다.

이렇게 가입하게되면 이용자는 30자를 넣었지만 25자까지만 비밀번호를 전송하게되겠죠?

 

 

/^ 내 앞에 있는 문자열들을 찾을거야

(?=.*[a-zA-Z]) 나는 모든 문자열중에 a-z와 일치하는 아이를 찾는 패턴이야

.{8,25}$ ^가 정해준 패턴들을 모든 문자열에서 찾고, 최소 8글자 최대 25글자인 애를 찾을거야

Comments