• [ JavaScript ] 정규식 ( Regular Expression)

    2021. 8. 3.

    by. KimBangg

    들어가기전에

     

    정규식은 특정 문자열을 찾고, 이를 특정한 내용을 바꿀 때 "매우 매우" 유용하게 사용됩니다.

    실제로 정규식을 사용 하고는 싶었으나 ! 이해가 어려워서 미루고 있던 도중 강의를 만나게 되어 ! 정리를 하게 되었습니다.

      

      

     

    1. 정규식 생성하기

     

    정규식의 생성은 아래와 같이 "//" 로 감싼 뒤, 변수에 담아두는 방식과

     

    const regExp = /abc/;

     

    다음과 같이 생성자를 이용하여 만들 수 있습니다.

    const regExp = new RegExp("abc");

     

      

      

    2. 정규식 사용법

     

    특수 문자

     

    특수문자는 \(백슬래쉬)를 앞에 붙여 줌으로써, 특수문자가 그대로 사용 될 수 있도록 해야합니다.

    const regExp1 = /\*/;
    const regExp2 = /\?/;

     

     

    플래그

     

    조금 더 섬세한 패턴을 찾기 위해서는 마지막 /  뒤에 특정 플래그를 사용합니다.

     

     

    - 전역 검색 ( Global )

     

    모든 검색 결과를 배열로 반환합니다.

    const str = "abcabc"
    
    str.match(/a/g); // (2) ["a", "a"]

     

     

    - 대소문자 구분 X

    const str = "abcabc"
    
    str.match(/a/g); // (2) ["a", "a"]

     

      

    메타문자 

     

    - 문자 그룹 ( Character Set ) : []

     

    [] 내부의 문자열이 하나라도 일치 하는 값들을 반환 해줍니다 :D

    const str = "rad and red";
    str.match(/r[ae]d/g);
    // (2) ["rad", "red"]

     

    이 때, 대괄호 내부에 들어가는 특수문자는 메타 문자로 취급되지 않기 때문에, 별도의 이스케이프를 하지 않아도 됨니다.

    const str = "!@#!#@#!";
    
    str.match(/[!.?]/g);

     

    문자 그룹에서 연속된 문자열을 보여주고 싶다면, -를 이용해서 간단하게 표현 할 수 있습니다.

    const alpha_regExp = /[A-Z]/;
    
    const num_regExp = /[0-9]/;
    
    const han_regExp = /[가-힣]/;

     

      

    10진수 문자 ( Digit Character : \d )

     

    10진수 문자열을 나타내는 /d 정규식은 위에서 언급했던 [0-9]와 같은 기능을 수행합니다.

     

      

    - 단어 문자 ( \w )

     

    단어문자는 영어 대,소문자 숫자 그리고 언더스코어를 포함하는 그룹 ( [ 0-9a-zA-z] ) 와 동일한 기능을 수행합니다.

    const str = "2021 08 05 kim";
    
    str.match(/w/g);
    // 모든 값을 출력
    
    str.match(/W/g);
    // 공백만을 출력

     

    - 공백 문자 ( \s )

      

    공백인 값을 출력하고, S(대문자) 의 경우는 대문자가 아닌 모든 값을 출력합니다.

     

     

      

    - 앵커 ( Anchor, ^, $ )

     

    앵커는 어떤 특정 위치에서 동작 할지를 제한 하는 역할을 수행합니다.

    // 여러 `w` 중에서 문자열의 시작 부분과 일치하는지를 확인합니다
    const str = "www";
    
    // 가장 첫 번째 `w` 만 반환됩니다
    str.match(/^w/);
    // ["w", index: 0, input: "www", groups: undefined]
    
    // 가장 마지막 `w` 만 반환됩니다
    str.match(/w$/);
    // ["w", index: 2, input: "www", groups: undefined]

    보시는 것 처럼 [^] 는 시작 위치를 의미하고, [$] 는 끝을 의미합니다.

     

    - 단어 경계 ( \b )

     

    다른 단어 문자가 앞이나 뒤에 등장하지 않는 위치임을 나타내는 문자입니다.

    const str = "create or ate";
    
    // 'ate' 의 좌우로 단어 문자가 없는 것만을 찾습니다.
    str.match(/\bate\b/g);
    //[ 'ate' ]
    
    str.match(/\Bate\b/);
    [ 'ate', index: 3, input: 'create or ate', groups: undefined ]

     

    - 숫자 일치

     

    - n번 일치  ( {n} )

    const str = "abcaabc"
    
    str.match(/a{1}b/);
    // ["ab"]
    
    str.match(/a{2}b/);
    // ["aab"]

     

    - n번 이상 m번 이하 일치 

     

    const str = "aaaaa"
    
    str.match(/a{1,3}b/);
    // ["aaa"]

     

    적어도 n번 일치

    const str = "aaaaa"
    
    str.match(/a{1, }b/);
    // ["aaa"]

       

      

      

    그룹화

     

    특정 부분을 단일 표현식으로 구분 짓기 위해 사용됩니다.

    const str ="aaabbabab"
    
    // 이 표현식은 [ab, abb, abbb..] 을 검색합니다.
    str.match(/ab+/g);
    
    // 이 표현식은 [ab, abab, abab..] 을 검색합니다.
    str.match(/(ab)+/g);

         

        

    3. 정규식 메소드 ( Regular Expression Method )

       

    1. test

     

    test는 특정 문자열 내부에, 정규식과 일치하는 내용이 있는지 유무를 파악 하는데 사용됩니다.

    const message2 = "안녕하세요. 010-1234-5687 말고 010-9876-5432으로  연락주세요";
    
    // \d는 숫자를 의미하고, {} 안의 숫자는 갯수를 의미합니다.
    const regExp = /\d{3}-\d{3,4}-\d{4}/;
    
    // test => true || false
    console.log(regExp.test(message));

     

       

    2. exec

        

    exec 함수는 정규식에 일치하는 내용의 위치와 정보를 출력 합니다.

    const message = "안녕하세요. 010-1234-5678 으로 연락주세요.";
    const regExp = /\d{3}-\d{3,4}-\d{4}/;
    
    // exec => pattern에 일치한 문자열과 위치
    console.log(regExp.exec(message));
    // output
    [
      '010-1234-5678',
      index: 7,
      input: '안녕하세요. 010-1234-5678 으로 연락주세요.',
      groups: undefined
    ]

     

       

    3. match

     

    match는 exec과 같은 정보를 출력합니다. 

    다만, 문자열에 메소드를 붙여서 사용한다는 점에서 차이가 있다고 말씀 드릴 수 있습니다.

    // pattern에 일치한 문자열과 위치 및 정보 출력
    console.log(message.match(regExp));
    // output
    [
      '010-1234-5678',
      index: 7,
      input: '안녕하세요. 010-1234-5678 으로 연락주세요.',
      groups: undefined
    ]

     

       

    4. replace

     

    replace는 정규식에 해당되는 내용을 변경 시키는 역할을 수행합니다.

    const message = "안녕하세요. 010-1234-5678 으로 연락주세요.";
    const message2 = "안녕하세요. 010-1234-5687 말고 010-9876-5432으로  연락주세요";
    
    
    // replace는 일치되는 부분을 원하는 내용, 값으로 변경
    console.log(message.replace(regExp, "전화번호"));
    // 모두 변경 하고 싶다면, /g 을 붙여주자 !
    console.log(message2.replace(/\d{3}-\d{3,4}-\d{4}/g, "전화번호"));
    // output
    안녕하세요. 전화번호 으로 연락주세요.
    
    안녕하세요. 전화번호 말고 전화번호으로  연락주세요

      

       

       

    5. 압축 ( Run-length-Encoding )

     

    이러한 정규식을 바탕으로, 다음과 같이 압축을 하는 방법도 존재합니다 :D

    const raw = "AAAAABBBCCCCDDFFFKKK";
    const raw_regExp = /(.)\1*/g;
    
    const result = raw
      .match(raw_regExp)
      .reduce((a, b) => a + `${b.length}${b.slice(0, 1)}`, "");
    
    console.log(result); // 5A3B4C2D3F3K

     

     

     

     

    참조

     

    https://wormwlrm.github.io/2020/07/19/Regular-Expressions-Tutorial.html

     

    정규표현식 완전정복 - 재그지그의 개발 블로그

    JavaScript를 활용하여 정규표현식의 기초부터 심화까지의 개념을 짚어봅니다.

    wormwlrm.github.io

     

    https://ko.javascript.info/regexp-introduction

     

    패턴과 플래그

     

    ko.javascript.info

     

    댓글