본문 바로가기
STUDY/javascript

[JavaScript] 정규식, 이메일 형식 검증해 보기

by 히컵 2024. 9. 6.

 

 

 

<input>에 입력한 값이 이메일 형식이 맞는지 검사하려면 어떻게 해야 할지 알아보자.

 

.includes()

문자열이나 배열에 특정 값이 포함되어 있는 확인하는데 사용되는 메서드.

 

1. 문자열에서의 .includes()

string.includes(substring, start);
  • substring : 찾고자 하는 부분 문자열.
  • start(선택 사항) : 검색을 시작할 위치. 기본값은 0.
const sentence = "안녕하세요, 만나서 반갑습니다.";

// '안녕'라는 단어가 포함되어 있는지 확인
console.log(sentence.includes("안녕"));  // true

// '헬로'라는 단어가 포함되어 있는지 확인
console.log(sentence.includes("헬로"));  // false

// 인덱스 10부터 검색 (인덱스 10 이후로는 '안녕'가 없으므로 false)
console.log(sentence.includes("안녕", 10));  // false


2. 배열에서의 .includes()

array.includes(element, start);
  • element : 찾고자 하는 배열의 요소.
  • start(선택 사항) : 검색을 시작할 위치. 기본값은 0.
const fruits = ["apple", "banana", "cherry"];

// 'banana'가 배열에 있는지 확인
console.log(fruits.includes("banana"));  // true

// 'grape'가 배열에 있는지 확인
console.log(fruits.includes("grape"));  // false

// 인덱스 2 이후에 'banana'가 있는지 확인 (인덱스 2 이후에는 없음)
console.log(fruits.includes("banana", 2));  // false

 

3. 특징

console.log("Hello".includes("hello"));  // false

const numbers = [1, 2, NaN];
console.log(numbers.includes(NaN));  // true
  • 대소문자를 구분한다. "Hello"와 "hello"는 다른 문자열로 간주된다.
  • 배열에서 NaN도 올바르게 인식한다.

 

 


 

 

이렇게 .includes()는 문자를 검사하는 가장 쉬운 방법니다.

하지만,

- 한글이 들어있냐, 

- 영어가 들어있냐,

- A로 끝나냐,

- 마침표 다음에 영어가 있냐

이런 건 includes()만으로 검사하기 어렵다.


정규표현식(regular expression)

줄여서 정규식은 문자열에서 특정 패턴을 찾거나, 그 패턴에 따라 문자열을 처리할 때 사용하는 식이다.

정규식은 복잡한 문자열 탐색, 치환, 추출 등의 작업을 단순화해 준다.

 

"어떤 문자에 'abc'라는 단어가 들어가 있냐?"라고 물어보고 싶을 때 쓰면 된다.

자바스크립트로 정규식을 어떻게 표현하냐면

/abc/

이러면 끝이다.

이제 abc라는 단어가 있냐고 물어볼 준비가 된 것이다.

 

그러면 abcded라는 문자에 abc라는 단어가 있는지 검사해보도록 하자.

/abc/.test('abcde')

/정규식/.test(정규식으로 검사해 볼 문자)를 쓰면 된다.

진짜 들어있으면 true, 없으면 false를 남겨 준다.


정규식 문법

정규식 문법은 너무 많아서 필요할 때 찾아쓰면 된다. 

자주 사용하는 몇 개만 알아보도록 하자.

 

/a/.test('abcde')  //true
/가/.test('나다라')  //false

영어나 한글의 경우 그냥 쓰면 글자가 있는지 없는지 물어볼 수 있다.

 

/[a-d]/.test('aefg')  //true
/[가-다]/.test('다라마바')  //true

[ ] 기호를 이용해서 문자 범위를 지정할 수 있다.

[a-z] :  a부터 z까지 아무 문자 하나를 의미

 

/[a-d].test('aefg') : a부터 d까지의 아무 문자 하나가 저기 있냐고 검사하는 것.

 

/[a-zA-Z]/.test('반가워요')  //false
/[a-zA-Z]/.test('반가워요a') //true
/[ㄱ-ㅎ가-힣ㅏ-ㅣ]/.test('반가워요')  //true

[a-zA-Z] : 아무 알파벳 하나를 의미

[ㄱ-ㅎ가-힣ㅏ-ㅣ] : 아무 한글 하나를 의미

 

/\S/.test('abcde')   //true

백슬래시S(\S)는 특수문자  포함 아무 문자 1개라는 의미이다.

 

^a/.test('abcde')   //true
/e$/.test('abcde') //true

^a : a로 시작하는지 검사할 수 있다.

e$ : e로 나는지 검사할 수 있다.

 

/(e|f)/.test('abcde')   //true

| 이건 or 기호이다.

위 코드는 e 또는 f 중 아무거나 한 문자가 있는지 검사 가능하다.

정규식에서는 괄후를 마음대로 칠 수 있다.

 

/a+/

+ 기호를 붙이면 뒤에 오는 글자들도 a와 일치하면 반복해서 쭉 찾아달라는 뜻이다.

왜냐하면 /a/는 a를 다 찾으라는 게 아니라 a 1개를 찾으라는 뜻이다.

aaaaa 이런 걸 찾고 싶으면 /a+/를 쓰면 된다.

 

/\S+t/

위 코드는 모든 문자 여러개 다음에 t라는 글자가 있냐를 검사해 주는 정규식이다.

aaaat, bbt 이런 것들을 찾아줄 것이다.


정규식 예시

1. 이메일 형식 검사

이메일은 어쩌구@어쩌구.어쩌구 이렇게 되어야 한다. 모든 문자 사이에 @ 그리고 .이라는 특수문자가 와야 한다.

/\S+@\S+\.\S+/

\.라는 기호를 쓴 이유는 마침표는 정규식에서 특수한 문법이기 때문에 마침표 문법을 쓰는 게 아니라 진짜 마침표를 찾아 달라는 의미로 쓰려면 백슬래시를 앞에 붙여야 한다.

 

2. 전화번호 형식 검사

 

전화번호는 000-0000-0000 이렇게 되어야 한다. 모든 문자 사이에 -라는 특수문자가 와야 한다.

/\d{3}-\d{4}-\d{4}$/

정규 표현식에서 { }는 반복을 나태는 구문이다.

\d는 숫자를 의미, \d{3}은 '숫자 3개'를, \d{4}는 '숫자 4개'를 의미한다.

 


 

 

그러면 폼 전송시 이메일 형식 검증은 어떻게 할까?

지난 포스팅에서 작성했던 <form> 태그를 가지고 왔다.

<div class="black-bg">
    <div class="white-bg">
        <h4>로그인하세요</h4>
        <form action="success.html">
            <div class="my-3">
              <input type="text" class="form-control" id="email">
             </div>
             <div class="my-3">
               <input type="password" class="form-control">
             </div>
             <button type="submit" class="btn btn-primary">전송</button>
             <button type="button" class="btn btn-danger" id="close">닫기</button>
          </form> 
    </div>
</div>

 

폼 전송시 아이디가 이메일 형식이 맞는지 검증하려면 이렇게 작성하면 된다.

$('form').on('submit',function(e){
  var 입력한값 = document.getElementById('email').value;
  if ( !/\S+@\S+\.\S+/.test(입력한값) ){
    alert('이메일형식아님')
    e.preventDefault();
  }
});

form 전송시 유저가 <input>에 입력한 걸 찾아서 정규식으로 이메일 테스트 했을 때 false가 나오면 폼 전송을 막고 alert()를 띄우라는 뜻이다.

 

그렇다면 폼 전송시 유저가 입력한 비밀번호에 영어 대문자가 적어도 1개 있는지 검사하려면?

$('form').on('submit',function(e){
  var password = document.getElementById('password').value;
  if ( /[A-Z]/.test(password) == false ){
    alert('대문자없음')
  }
});

 

 

 

 

 

* 이 포스팅은 코딩애플 강의를 토대로 작성하였습니다.