JAVASCRIPT

[JAVASCRIPT#09]정규표현식(Regular Expression)

양동민 2020. 12. 23. 03:49

정규표현식이란 "문자열 검사식"이다.

일일이 문자열을 검사하기에는 에너지 낭비가 너무 심하다. 

ex)8~20자 이내이며, 영문 소문자와 숫자로만 구성된 아이디를 검사한다면,

https://regexper.com 사이트를 들어가보자.

 

예를 들어 휴대전화번호 모양을 예시로 들어보자.

첫번째 자리 0

두번째자리 1

세번째자리 0/1/6/7/8/9 중 하나

네번째자리 -

다섯번재자리 1~9중 하나

여섯번째자리 0~9중 하나

일곱번째자리 0~9중 하나

여덟번째자리 0~9중 하나

아홉번째자리 -

열번째자리 0~9중 하나

열한번째자리 0~9중 하나

열두번째자리 0~9중 하나

열세번째자리 0~9중 하나

 

홈페이지를 보면 입력 칸이있다.

^는 시작

$는 끝

[]는 one of라는 의미이다. 휴대폰 번호를 예로 들자면

^01[016789]-[123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789][0123456789][0123456789]$ 

이렇게 시작(^)부터 끝($)까지 검사를 하게 만들 수 있다. 

 

아이디, 비밀번호, 닉네임, 전화번호, 카드번호, 생년월일, 홈페이지주소 등 검사가 필요한 부분은 이렇게 만들어 진행하면 된다. 이러한 검사들을 할 수 있게 만들수 있도록 식을 만드는것을 '정규 표현식'이라고 한다.

참고로 띄어쓰기는 절대 하지 않아야한다. 식이 완전 달라진다.

 

한 번 

<script>

  function checkBirth(){

  //미리 만들어둔 전화번호 검사식으로 전화번호 입력값을 검사하도록 구현

  //준비물 : 검사식(regex), 입력태그(input), 출력태그(span)

  //정규표현식 검사명령 : regex.test() --> boolean

  //정규표현식은 만들때 슬래시(/)로 감싸서 만든다.

  var regex=/^01[016789]-[123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789][0123456789][0123456789]$/;

 

  var phoneInput = document.querySelector("input[name=phone]");

  var phoneSpan = document.querySelector("input[name=phone]+span");

  

  if(regex.test(phoneInput.value)){

    phoneSpan.textContent="올바른 전화번호 형식입니다";

  }

  else{

    phoneSpan.textContent="잘못된 전화번호 형식입니다";

  }

}

  

</script>

</head>

<body>

  <input type="text" name="phone" placeholder="전화번호" oninput="checkBirth();">

  <span></span>

</body>

</html>

 

이러한 식이 나오게된다.

이제부터는 ^01[016789]-[123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789][0123456789][0123456789]$  식을 줄여보도록 해보자.

 

^01[016-9]-[1-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$ 로 줄일 수 있다. (-)는 되고 (~)는 안된다.

^01[016-9]-[1-9][0-9]{3}-[0-9]{4}$ 로 더욱 줄일 수 있다.

[ ]를 n개의 개수가 뒤에 반복된다면 곱하기 개념으로 이해하면 된다. 

또한 (-)는 전화번호에 입력에 있어서 있어도 되는경우 없어도 되는 경우가 있는데

무조건 있어야한다면 위와같이 하면되고, 없어도 되면 빼기모양을 빼면 그만이다.

하지만 있어도 없어도 되게 만들려면  -뒤에?를 넣어서 -? 를 넣으면된다.

^01[016-9]-?[1-9][0-9]{3}-?[0-9]{4}$ 와 같이 말이다.

1부터 0은 안된다. 0부터 9는 가능하다. 그 이유는 ASCII코드에 의해, 0=48, 1=49이기에 역으로 가는것은 안된다. 때문에 0~9로 가는 식으로 이해하자.

 

추가로, 빼기가 두개 다 있거나 아예 없는 경우로 한다면 |를 이용하여 다음과 같이 만들 수 있다.

^((01[016-9][1-9][0-9]{3}[0-9]{4}$)|(^01[016-9]-[1-9][0-9]{3}-[0-9]{4}))$