개요

  • 정규표현식을 정리한다.
  • 각 프로그래밍언어마다 공통적인 부분도 있지만 조금씩 문법이 다르기 때문에 다른 부분은 언어별로 정리해야 한다.
  • 펄, 자바스크립트, 루비처럼 언어의 문법에 정규표현식이 내장되어 있는 경우도 있고, 자바나 파이썬, 닷넷처럼 표준 라이브러리를 사용해서 지원하는 경우도 있다.

표준 문법 (POSIX 기본 및 확장 표준 문법)

대부분 언어의 정규표현식에서 기본으로 가지고 있는 문법이다.

데이터의 시작과 끝

데이터의 시작은 ^ 로, 데이터의 끝은 $로 표시한다.

문자

. 은 1개의 문자와 일치하는 것을 의미힌다.

하위식 ()

그룹을 표현한다.여러 식을 하나로 묶을 수 있다. abc¦adca(b¦d)c는 같은 의미를 가진다.

문자클래스 []

[] 사이의 문자 중 하나를 선택한다. ¦를 여러 개 쓴 것과 같은 의미이다. 예를 들면 [abc]d는 ad, bd, cd를 뜻한다. 또한, - 기호와 함께 쓰면 범위를 지정할 수 있다. [a-z]는 a부터 z까지 중 하나, [1-9]는 1부터 9까지 중의 하나를 의미한다.

부정[^]

문자클래스([])안에 ^를 적으면 부정을 의미한다. 문자 클래스 안의 문자를 제외한 나머지를 선택한다. 예를 들면 [^abc]d는 ad, bd, cd는 포함하지 않고 ed, fd 등을 포함한다. [^a-z]는 알파벳 소문자로 시작하지 않는 모든 문자를 의미한다.

0회이상

*는 0회 이상을 의미한다. “a*b”는 “b” (a가 0회), “ab” (a가 1회), “aab” (a가2회), “aaab” (a가 3회)를 포함한다.

최소, 최대 발생 횟수

{M, N}은 최소 M번, 최대 N번 발생되는 패턴과 일치시킨다. 숫자를 하나만 적으면 해당 회수에 정확히 일치하는 패턴을 찾는다. 예를들어 {3}이라면 세번 발생하는 패턴을 찾는다.

POSIX 확장 문법

  • ?: 0 또는 1회를 의미한다. “a?b”는 “b” (a가 0회 등장), “ab” (a가 1회등장)를 포함한다.
  • +: 1회이상을 의미한다. “a+b”는 “ab” (a가 1회등장), “aab” (a가 2회등장), “aaab” (a가 3회등장)를 포함하지만 “b” (a가 0회 등장)는 포함하지 않는다.
  • |: 선택. 여러 식 중에서 하나를 선택한다. 예를 들어, “abc¦adc”는 abc와 adc 문자열을 모두 포함한다.

자바스크립트의 정규식

자바스크립트 정규표현식 문법

정규식의 시작과 끝

슬래시(/)로 시작해서 슬래시로 끝나는게 자바스크립트 정규식의 관습인 것 같다. (꼭 따르지 않아도 동작한다는 얘기도 있지만, 일단 따르는게 여러모로 좋아보인다.)

정규식 만들기

다음과 같이 정규식을 만들 수 있다. 많이 보이는 패턴이다.

const re = /ab+c/

혹은 다음과 같이 생성자 함수를 이용해서 만들 수도 있다.

const re = new RegExp('ab+c')

플래그

플래그라는 개념이 있다. 정규식의 끝의 슬래시 뒤에 영어소문자가 붙어있는 경우가 있는데 이게 플래그를 사용한 것이다.

예를 들면 다음과 같은 정규표현식이다.

const re = /\w+\s/g;

플래그 중에서 자주보이는 건 g 나 i 다. 각각의 의미는 다음과 같다.

  • g: 전역탐색. g가 없으면 기본적으로 한번만 찾으면 종료한다. g가 있으면 모든 경우를 찾는다.
  • i: 대소문자를 구분하지 않음

더 상세한 정보는 여기 를 참고하자.

정규식 실행하기

자바스크립트에서 정규식은 exec함수로 실행할 수 있다.

exec함수는 정규표현식에 일치하는 결과를 찾으면 배열을 반환한다. 배열의 첫번째 값은 정규표현식에 일치한 전체 문자열이다. 정규표현식에서 괄호로 표현된 부분에 일치하는 값이 있으면 배열의 두번째 값으로 반환해준다.

웹 브라우저에서 테스트하기

웹 브라우저에서 F12 (디버거툴)을 눌러서 console탭에서 테스트할 수 있다.

다음과 같이 테스트한다. exec 함수에 정규표현식을 적용할 대상이 되는 문자열을 파라메터로 넘겨준다.

const myRe = /d(b+)d/g;
myRe.exec('cdbbdbsbz');

이 정규표현식은 “d로 시작해서 다음에는 b가 한번이상 나오고 d로 끝나는 문자열을 대상 문자열 전체에서 찾으라” 는 의미이다. 위의 실행결과는 다음과 같다.

(2) ['dbbd', 'bb', index: 1, input: 'cdbbdbsbz', groups: undefined]

exec함수는 정규표현식에 일치하는 결과를 찾으면 배열을 반환한다. 배열의 첫번째 값은 정규표현식에 일치한 전체 문자열이다. 위의 예에서는 dbbd이다. 그리고 정규표현식에서 괄호로 표현된 부분에 일치하는 값이 있으면 배열의 두번째 값으로 반환해준다. ✨위의 예에서는 bb 이다. (정규표현식 (b+) 에 매칭되는 부분이다.) 괄호에 일치하는 부분을 반환해주는 건 개발할 때 이 부분만 따로 추출해서 사용하는 경우가 많기 때문인 것으로 보인다.

참고로 exec 함수이외에도 test 함수도 있다. test함수는 주어진 문자열이 정규 표현식을 만족하면 true를, 아니면 false를 반환한다.

그리고 문자열에서 바로 match()함수를 호출해서 쓸 수도 있다. match함수의 파라메터로 정규표현식을 넘겨주면 된다. 다음과 같은 식이다. match 함수도 exec함수와 마찬가지로 배열을 리턴해준다. 배열의 형식도 동일하다.

"some str".match(/regex/)

웹 사이트에서 테스트하기

https://regex101.com/ 과 같은 웹사이트에서 테스트할 수도 있다.

참고

  • https://namu.wiki/w/%EC%A0%95%EA%B7%9C%20%ED%91%9C%ED%98%84%EC%8B%9D
  • https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D
  • https://regex101.com/
  • https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Regular_expressions
  • https://hamait.tistory.com/342