본문 바로가기

javascript/pure

[자바스크립트] RegExp - 자바스크립트와 정규표현식

 다양한 종류의 정보들은 저마다의 특정한 규칙을 가지는 경우가 많다. 예를 들어 전화번호라는 정보는 010 으로 시작하여 3자리 혹은 4자리 숫자가 2번 반복된다는 규칙을 가진다. 따라서 우리는 010-XXXX-XXXX 라는 문장을 보면, 앞서 언급한 규칙에 기반하여 이 문장을 전화번호로 판단할 수 있다. 즉, 우리는 전화번호의 패턴에 기반하여 특정 문장이 전화번호인지 여부를 알 수 있는 것이다.

 특정 정보들이 공통적으로 가지고 있는 고유한 패턴을 이용하면 주어진 데이터에서 해당 정보들을 식별할 수 있는데, 이때 사용되는 고유한 패턴을 정규표현식이라고 한다. 정규표현식은 특정 정보의 문자열을 일정한 패턴으로 표현하는 형식 언어로, 많은 프로그래밍 언어에서 regex 등의 이름으로 해당 기능을 지원하고 있다.


정규표현식

https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Regular_Expressions

 

정규 표현식 - JavaScript | MDN

정규 표현식은 문자열에 나타는 특정 문자 조합과 대응시키기 위해 사용되는 패턴입니다. 자바스크립트에서, 정규 표현식 또한 객체입니다.  이 패턴들은 RegExp의 exec 메소드와 test 메소드  ,

developer.mozilla.org

자바스크립트에서 정규표현식은 다음 두가지 방식으로 나타낸다.

  • const regex = /pattern/flags 
  • const regex = new RegExp('pattern' , 'flags')

 정규표현식 자체는 패턴 및 플래그 부분으로 나뉜다. 패턴은 특정 정규표현식의 구조를 나타내고, 플래그는 해당 정규표현식에 적용되는 규칙을 나타낸다. 

 정규표현식 및 생성되는 문자열들은 다양한 정보를 가진다.

 

  • exec 등에 의한 배열

    [0] - 대응된 문자열
    input - 입력 원본
    index - 문자열 인덱스

  • regex 객체

    lastIndex - 마지막 인덱스(g 옵션시 활성화)
    source - 정규표현식

마지막으로 평가한 인덱스 위치를 기록하는 모습


플래그

정규표현식에 적용될 수 있는 플래그는 6가지가 있다.

  • g : 주어진 문자열 내에서 해당 패턴에 맞는 모든 문자열을 찾는다. ( 없으면 첫번째만 ) 
  • i : 대소문자를 구분하지 않는다.
  • m : 정규표현식이 다중행으로 구성될 때, ^ 및 $ 을 각 행에 대해 동작하게 만든다.
  • s : . 특수기호가 개행 문자도 포함하게 한다.
  • u : 유니코드를 지원한다. \p{...} 으로 나타낼 수 있지만, 몇몇 브라우저에서는 지원하지 않는다.
  • y : sticky 모드. lastIndex 에서 시작하는 문장이 정규표현식에 대응되는지 판단한다.

str에서 마지막으로 평가한 인덱스 위치를 기록한다.

 


패턴

정규표현식에서는 패턴을 나타낼 때, 여러가지 특수문자를 이용한다. 

  • \ : 뒤이어 나오는 문자를 "그대로" 해석한다.  ex ) a\* -> a* : *은 특수문자로 해석되지 않는다.
  • ^ : 정규표현식의 시작부분과 대응한다.  ex ) ^a.* : a로 시작. a , apple, add, aunt ... 
  • $ : 정규표현식의 끝부분과 대응한다.  ex ) *.txt$ : 패턴을 따르다가, 마지막에 t로 끝난다.
  • * :  앞부분이 0회 이상 반복된다.  ex ) s* : '', s, ss, sss ...
  • + : 앞부분이 1회 이상 반복된다. {1, } 와 같다.  ex ) s+ : s, ss, sss ...
  • ? : 앞부분이 1회 있거나 없다.  ex ) app?le? : apple, aple, appl, apl
  • . : 개행 문자를 제외한 모든 문자와 대응.  ex ) .k : ak, bk, ck, ... 
  • (x) : 괄호 내의 패턴을 하나로 처리한다.  ex ) a(ppl)?e : apple , ae / replace(/(he)ll(o)/, '$2 $1')
  • {n, m} : 앞부분을 n회 이상, m회 이하 반복한다.  ex ) a{1,3} : a, aa, aaa
  • [xyz] : 문자셋을 나타낸다. 문자셋에 포함된 문자 중 하나를 선택한다.  ex ) [abc] : a, b, c
  • [^xyz] : 해당 문자셋을 제외한 모든 문자를 의미한다.
  • ( abc | def ) : 주어진 문자열 중 하나에 대응된다.

 

 위 언급된 플래그 및 특수기호를 조합하여 원하는 패턴을 만들면 된다. 사실 우리가 사용할만한 대부분의 정규표현식은 이미 어느정도 완성되어 있으며, 공식 표준이 존재하는 경우도 있으니 적당히 찾아서 사용하는 것도 방법이다.


요약

정규표현식은 특정 문자열의 패턴을 나타내기 위해 사용되는 형식언어의 일종으로, 자바스크립트에서는 RegExp 객체를 통해 구현된다. 패턴과 플래그로 구분되며, 여러 특수기호를 알맞게 조합하여 특정 패턴을 나타낼 수 있다.