본문 바로가기

HTML & CSS & JavaScript/JavaScript

정규 표현식 (Regular Expression)

  • 정규 표현식(Regular Expression)
    - 특정한 규칙을 가진 문자열 집합을 표현하는데 사용하는 형식의 언어

    - 정규 표현식을 이용하면 입력된 문자열에 대한
      특정조건 검색, 일치여부 판단, 치환에 대한 조건문을 간단히 처리할 수 있음

    - 정규 표현식 참고 사이트
    1) https://regexper.com/ : 작성한 정규표현식을 그림으로 나타내주는 사이트
    2) https://regexr.com/ : 정규표현식 테스트 사이트
    3) https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/%EC%A0%95%EA%B7%9C%EC%8B%9D : MDN - 정규표현식 설명

  • 정규 표현식 객체 생성 및 확인하기
    1. 정규 표현식 객체 생성 방법
       1) const regExp = new RegExp("정규표현식");
       
       2) const regExp = /정규표현식/;
       ※ 양쪽의 ' / ' 기호는 정규 표현식의 리터럴 표기법

    2. 문자열 패턴 확인 메소드(함수) 
       1) regExp.test(문자열)
       : 문자열에 정규 표현식과 일치하는 패턴이 있을 경우 true / 없으면 false

       2) regExp.exec(문자열)
       : 문자열에 정규 표현식과 일치하는 패턴이 있을 경우
         처음 매칭되는 문자열을 반환 / 없으면 null 반환
// 정규 표현식 객체 생성 + 확인하기
document.getElementById('check1').addEventListener('click', function(){

    // 정규 표현식 객체 생성
    const regExp1 = new RegExp("script");
                  // "script"와 일치하는 문자열이 있는지 검사하는 정규 표현식

    const regExp2 = /java/;
                  // "java"와 일치하는 문자열이 있는지 검사하는 정규 표현식
                  
    // 확인하기
    const str1 = "저희는 지금 javascript 공부 중입니다.";

    const str2 = "조만간 servlet/jsp(java server page)도 배웁니다.";

    const str3 = "java는 이미 기억 속에 없습니다... 기억을 java...";

    console.log("regExp1.test(str1): " + regExp1.test(str1)); // true
    
    console.log(regExp1.exec(str1)); // 결과 : 이미지 1번

    console.log("regExp2.test(str2): " + regExp2.test(str2)); // true
    
    console.log(regExp2.exec(str2)); // 결과 : 이미지 2번
    
    // 일치하는 게 없는 경우
    console.log("regExp1.test(str2): " + regExp1.test(str2)); // false
    console.log(regExp1.exec(str2)); // null

    // 일치하는 게 여러 개 있을 경우
    console.log("regExp2.test(str3): " + regExp2.test(str3)); // true
    console.log(regExp2.exec(str3)); // 결과 : 이미지 3번
})

1번
2번
3번 : 가장 처음 일치하는 문자열의 인덱스를 반환


  • 정규 표현식의 메타 문자
    - 문자열의 패턴을 나타내는 문자열
    - 문자마다 지정된 특별한 뜻이 담겨 있음

    - a (일반문자열) : 문자열 내에 a 라는 문자열이 존재하는지 검색
    - [abcd] : 문자열 내에 a,b,c,d 중에 하나라도 일치하는 문자가 있는지 검색
    - ^(캐럿) : 문자열의 시작을 의미
    - $(달러) : 문자열의 끝을 의미

    - \w (word, 단어)  : 아무 글자 (단, 띄어쓰기, 특수문자("_"만 가능), 한글 X)
    - \d (digit, 숫자) : 아무 숫자 (0~9 중 하나)
    - \s (space, 공간) : 아무 공백 문자 (띄어쓰기, 엔터, 탭 등)

    - [0-9] : 0부터 9까지 모든 숫자
    - [ㄱ-힣] : ㄱ부터 힣까지 모든 한글
    - [a-z] : 모든 영어 소문자
    - [A-Z] : 모든 영어 대문자

    ※ 특수문자의 경우 각각을 입력하는 방법밖엔 없음
        단, 메타문자와 중복되는 특수문자는
        앞에 \(백슬래시)를 추가하여 탈출 문자(Escape)로 만들어 사용

    - 수량 관련 메타 문자
    - a{5} : a문자가 5개 존재 == aaaaa
    - a{2,5} : a가 2개 이상 5개 이하 == aa, aaa, aaaa, aaaaa
    - a{2,} : a가 2개 이상

    - * : 0개 이상 == 0번 이상 반복 == 있어도 되고, 없어도 되고
    - + : 1개 이상 == 1번 이상 반복
    - ? : 0개 또는 1개
    - . : 1칸 (개행문자를 제외한 문자 하나)
<button id="btn1">확인하기</button>

<div id="div1" class="area"></div>
document.getElementById('btn1').addEventListener('click', function(){

    const div1 = document.getElementById('div1');

    // 1) a(일반 문자열) : 문자열 내에 a라는 문자열이 존재하는지 검색
    const regExp1 = /a/;
    div1.innerHTML = "/a/, apple : " + regExp1.test("apple") + "<hr>";
    div1.innerHTML += "/a/, int : " + regExp1.test("int") + "<hr>";


    // 2) [abcd] : 문자열 내에 a,b,c,d 중 하나라도 일치하는 문자가 있는지 검색
    const regExp2 = /[abcd]/;
    div1.innerHTML += "/[abcd]/, apple : " + regExp2.test("apple") + "<hr>";
    div1.innerHTML += "/[abcd]/, int : " + regExp2.test("int") + "<hr>";


    // 3) ^(캐럿) : 문자열의 시작을 의미
    const regExp3 = /^java/; // 문자열의 시작이 "java"인지 확인
    div1.innerHTML += "/^java/, javascript : " + regExp3.test("javascript") + "<hr>";
    div1.innerHTML += "/^java/, 내손을java : " + regExp3.test("내손을java") + "<hr>";


    // 4) $(달러) : 문자열의 끝을 의미
    const regExp4 = /java$/; // 문자열의 시작이 "java"인지 확인
    div1.innerHTML += "/java$/, javascript : " + regExp4.test("javascript") + "<hr>";
    div1.innerHTML += "/java$/, 내손을java : " + regExp4.test("내손을java") + "<hr>";
})

See the Pen 24-12-25 js review28 by Namu (@Namu-the-sans) on CodePen.


  • 정규 표현식 예제
    1. 이름 유효성 검사 (한글 2 ~ 5글자)
<h3>이름 유효성 검사</h3>
<h5>한글 2~5글자</h5>
이름 : <input type="text" id="inputName"><br>
<span id="result"></span>
// 이름 유효성 검사
document.getElementById('inputName').addEventListener('keyup', function(){
    
    // 한글 2~5글자 정규 표현식(정규식)
    const regExp = /^[가-힣]{2,5}$/; // 한글(단일 자음, 모음 제외)

    // 유효성 검사
    if(regExp.test(this.value)){ // 조건 일치하는 경우, 초록 글씨 : 유효한 이름 형식 입니다.
        document.getElementById('result').innerHTML = "유효한 형식의 이름 입니다.";
        document.getElementById('result').style.color = 'green';

    } else{ // 아닌 경우, 빨간 글씨 : 유효하지 않은 이름 형식 입니다.
        document.getElementById('result').innerHTML = "유효하지 않은 형식의 이름 입니다."
        document.getElementById('result').style.color = 'red';
    }
    // 빈칸이라면 span 작성된 내용 초기화(삭제)
    if(this.value == ''){
        document.getElementById('result').innerHTML = '';
    }
})

See the Pen 24-12-25 js review29 by Namu (@Namu-the-sans) on CodePen.


   2. 주민등록번호 유효성 검사

<h3>주민등록번호 유효성 검사</h3>
주민등록번호 : <input type="text" id="inputPno"><br>
<span id="PnoResult">주민등록번호를 작성해주세요</span>
.confirm{color: green;}
.error{color: red;}
// 주민등록번호 유효성 검사
document.getElementById('inputPno').addEventListener('input', function(){

    const span =  document.getElementById('PnoResult');

    if(this.value == '') { // 미작성인 경우 : 주민등록번호를 작성해주세요.(까만글씨)
        span.innerHTML = '주민등록번호를 작성해주세요.';
        span.classList.remove('error');
        span.classList.remove('confirm');
        return; // 함수 종료
    } 

    // 주민등록번호 정규식
    // const regExp = /^\d{6}-[0-9]{7}$/; // 생년월일(6)-고유번호(7)
                    
    // 업그레이드
    const regExp = /^\d{2}(0[1-9]|1[0-2])(0[1-9]|1[0-9]|2[0-9]|3[0-1])-[1-4]\d{6}$/;
                  // 연도(2)   월(2)           일(2)

    //() : 포획 괄호, 괄호 내부에 대응되는 부분을 찾아서 기억함
    // | : 또는

    // 월(月)
    // 01~09 -> 0[1-9]
    // 10~12 -> 1[0-2]

    // (0[1-9]{2}|1[0-2]{2}) : 괄호 내 | 기호를 기준으로 구분되며
    // 0이 먼저 입력된 경우 다음 자리는 1 ~ 9
    // 1이 먼저 입력된 경우 다음 자리는 0 ~ 2

    // 일(日)
    // 01~09 -> 0[1-9]
    // 10~19 -> 1[0-9]
    // 20~29 -> 2[0-9]
    // 30~31 -> 3[0-1]

    // 유효성 검사

    // 요소.classList : 요소가 가지고 있는 클래스를 배열로 반환
    // 요소.classList.add("클래스명") : 요소에 특정 클래스 추가
    // 요소.classList.remove("클래스명") : 요소의 특정 클래스 제거

    if(regExp.test(this.value)) { // 유효한 경우 : 유효한 주민등록번호 형식 입니다.(초록글씨)
        span.innerHTML = "유효한 주민등록번호 형식 입니다.";
        span.classList.add("confirm");  // confirm 클래스 추가
        span.classList.remove('error'); // error 클래스 제거

    } else { // 아닌 경우 : 유효하지 않은 주민등록번호 형식 입니다.(빨간글씨)
        span.innerHTML = "유효하지 않은 주민등록번호 형식 입니다."
        span.classList.add('error');
        span.classList.remove('confirm');
    }
})

See the Pen 24-12-25 js review30 by Namu (@Namu-the-sans) on CodePen.

'HTML & CSS & JavaScript > JavaScript' 카테고리의 다른 글

DOM ( Document Object Model)  (0) 2024.12.26
객체 ( Array )  (0) 2024.12.26
배열(Array)  (0) 2024.12.25
문자열, 숫자, 형변환, 연산자  (0) 2024.12.25
이벤트(Event)  (0) 2024.12.18