Link Search Menu Expand Document

정규 표현식(정규식)

정의

💡 문자열에서 특정 문자 조합을 찾기 위한 패턴이다.

  • Javascript에서는 정규 표현식도 객체이다.

메서드

  • RegExpexec()test() 메서드를 사용할 수 있다.
  • Stringmatch(), matchAll(), replace(), replaceAll(), search(), split()에 사용할 수 있다.

생성

정규 표현식을 만드는 두 가지 방법이 있다.

  1. 정규 표현식 리터럴 : 슬래시로 패턴 감싸기 /패턴/
    • 이 방식은 스크립트를 불러올 때 컴파일된다.
    • 바뀔 일이 없는 패턴의 경우 리터럴을 사용하면 성능이 향상될 수 있다.
  2. RegExp 객체 : 생성자 호출 new RegExp('패턴')
    • 생성자 함수를 사용하면 정규 표현식이 런타임에 컴파일된다.
    • 바뀔 수 있는 패턴이나, 사용자 입력 등 외부 출처에서 가져오는 패턴의 경우 이것을 사용하면 된다.
// 1. 정규 표현식 리터럴
const re1 = /ab+c/;

// 2. RegExp 객체 생성자 호출
const re2 = new RegExp('ab+c');

패턴

정규 표현식 패턴은 문자, 문자와 특수 문자 등의 조합으로 구성될 수 있다.

- : 범위(어디에서 어디까지)

  • a-z : a에서 z까지를 의미
  • 0-9 : 0에서 9까지를 의미
  • ㄱ-ㅎ : ㄱ에서 ㅎ까지를 의미
  • ㅏ-ㅣ : ㅏ에서 ㅣ 까지를 의미
  • 가-힣 : ‘가’에서 ‘힣’까지를 의미

[] : 괄호 안에 문자중 1개

  • [a-z] : a에서 z중 하나.
  • [abc]d : ad, bd, bd를 의미

[^] : 괄호안의 문자 부정(제외)

  • [^a-z] : a ~ z를 제외한 모든 문자
  • [^0-9] : 숫자를 제외한 모든 문자

^ : 문자열의 처음

  • ^[a-zA-Z] : 영문자로 시작해야함

$ : 문자열의 끝

  • [a-zA-Z]$ : 영문자로 끝나야함
  • ^[a-zA-Z]$ : 영문자로 시작하고, 영문자로 끝나야함

| : 또는(OR)

  • [a-z|A-Z] : a ~ z 또는 A ~ Z 의미(영어 전체)
  • [ㄱ-ㅎ|ㅏ-ㅣ|가-힣] : ㄱ ~ ㅎ 또는 ㅏ ~ ㅣ 또는 가 ~ 힣 의미(한글 전체)

* : 0회 이상(여러개)

  • ^[a-zA-Z]*$ : 여러개의 문자가 모두 영문자여야 함
  • ^[0-9]*$ : 여러개의 문자가 모두 숫자여야 함
  • ^[a-zA-Z0-9]*$ : 여러개의 문자가 모두 영문자나 숫자여야 함

{m, n} : m회 이상, n회 이하

  • ^[a-zA-Z]*${1, 10} : 영문자 1자 이상, 10자 이하

플래그(옵션)를 활용한 고급 탐색

  • Javascript에 replace()는 있지만 replaceAll()은 없다.
  • 이때 플래그를 활용하면 전역 탐색이나 대소문자 무시와 같은 특성을 지정할 수 있다.
  • 플래그는 단독으로 사용할 수도 있고, 순서 상관 없이 한번에 여럿을 지정할 수도 있다.
  • gi가 가장 자주 쓰인다.
// 1. 정규 표현식 리터럴
const re1 = /pattern/flags;

// 2. RegExp 객체 생성자 호출
const re2 = new RegExp('pattern', 'flags');

g : 전역 탐색

  • 패턴과 일치하는 모든 부분을 찾는다.

      const re1 = /[1]/;
      const str1 = '010-1111-2222';
      console.log(str1.replace(re1, 3)); // 030-1111-2222
    
      const re2 = /[1]/g;
      // 또는
      // const re1 = new RegExp('1', 'g');
      const str2 = '010-1111-2222';
      console.log(str2.replace(re2, 3)); // 030-3333-2222
    

i : 대소문자를 구분하지 않음

  • 대소문자를 구분하지 않고 일치하는걸로 간주한다.

      const re1 = /[a]/;
      const str1 = 'A';
      console.log(str1.replace(re1, 'b')); // A
    
      const re2 = /[a]/i;
      // 또는
      // const re2 = new RegExp('A', 'i');
      const str2 = 'A';
      console.log(str2.replace(re2, 'b')); // B
    

d : 부분 문자열 일치에 대해 인덱스 생성

m : 여러 줄에 걸쳐 탐색

s : 개행 문자가 .과 일치함

u : “unicode”, 패턴을 유니코드 코드 포인트의 시퀀스로 간주함

y : “접착” 탐색, 대상 문자열의 현재 위치에서 탐색을 시작함

참고