정규표현식 시작하기


정규표현식(Regular expression, Regex)은 문자열 관련 작업을 할 때 굉장히 유용하게 사용할 수 있는 도구입니다. 처음 문법을 모르고 보면 정규표현식 만큼 이상한 것도 없지만 배우고 나면 세상이 편해지기 때문에... 배우는걸 추천드립니다.

/[+-]?(d*.)?d+/

정규표현식 사용방법

대부분의 현대 프로그래밍 언어들은 정규표현식 라이브러리를 내장하고 있기 때문에 별도의 설치 없이 사용할 수 있습니다. 이 글에서는 자바스크립트를 기준으로 작성할텐데 자바스크립트는 정규표현식 리터럴을 지원하기 때문에 접근성이 좋습니다. 아래는 몇몇 언어들에서의 정규식 사용법입니다.

Javascript

const pattern = /[+-]?(d*.)?d+/
console.log(pattern.exec('123.34')
// 결과
// [ '123.34', '123.', index: 0, input: '123.34', groups: undefined ]

Python 3

import re
re.match(r'[+-]?(d*.)?d+', '123.34')
# 결과
# <re.Match object; span=(0, 6), match='123.34'>

C#

using System;
using System.Text.RegularExpressions;

class Program {
    static void Main() {
        Regex pattern = new Regex(@"[+-]?(d*.)?d+");
        Console.WriteLine(pattern.Match("123.34"));
    }
}

// 결과: 123.34

기본

일반 알파벳이나 숫자는 문자열에서 일치하는 부분을 찾습니다.

const re = /triumph/
re.exec('This was a triumph')

/* 결과
[
  'triumph',
  index: 11,
  input: 'This was a triumph',
  groups: undefined
]
*/

메타 문자

메타문자를 이용하면 여러 문자 또는 특수한 문자를 찾을 수 있습니다. 아래는 자주 쓰는 메타 문자들입니다.

메타문자 설명
\d 숫자를 찾습니다.
\w 알파벳과 숫자를 찾습니다.
\s 공백 문자를 찾습니다.
\b 문자와 공백 사이를 찾습니다.
\^ 입력 문자열의 시작을 찾습니다.
$ 입력 문자열의 끝을 찾습니다.
. 개행(\n)을 제외한 모든 문자열을 찾습니다.
? 앞 문자를 옵션으로 만듭니다. ab?c패턴은 ac와 abc를 모두 찾습니다.

알파벳 형식의 메타문자는 대문자로 사용하면 여집합을 찾습니다. 예를 들어 S는 공백이 아닌 문자를 찾습니다.

문자 클래스

대괄호 []안의 문자중 하나를 찾습니다. 문자 클래스 내부에서 ^는 여집합, -는 범위를 의미합니다.

ex) [abc]: a또는 b또는 c [a-zA-Z0-9]: w와 동일 [^a-z]: 소문자 알파벳을 제외한 문자 [가-힣]: 모든 한글

반복

{m}혹은 {m, n}은 앞 문자의 반복을 찾습니다. {m}은 앞 문자가 정확히 m번 반복된 것을 찾습니다. {m, n}은 앞 문자가 m번 이상, n번 이하 반복된 것을 찾습니다.

*는 앞 문자가 0번 이상 반복된 것을 찾습니다. +는 앞 문자가 1번 이상 반복된 것을 찾습니다.

캡처 그룹

소괄호 ()안의 패턴을 찾으면 찾은 값을 캡쳐합니다. 만약 그룹화만 필요하고 그룹의 값은 필요 없다면 (?:)패턴의 넌-캡처링 그룹을 사용하는 것이 좋습니다.

ex) (abc|xyz): abc 혹은 xyz를 캡처합니다. (abc)+: abcabcabc...의 패턴을 캡처합니다.

옵션 플래그

정규 표현식이 패턴을 찾는 방식을 바꿀 수 있는 옵션들이 몇 개 있습니다. 아래는 자주 사용하는 플래그들입니다. 이 외에도 s, u, y옵션이 있는데 관련 내용은 여기에서 찾을 수 있습니다.

플래그 설명
g 하나의 패턴을 찾고 멈추지 않고 모든 패턴을 찾습니다.
i 대소문자를 구분하지 않습니다.
m ^$가 각각 줄의 시작, 줄의 끝을 찾도록 합니다.

자바스크립트에서 옵션을 사용하려면 아래처럼 정규표현식 리터럴 끝에 옵션을 붙여주면 됩니다.

/[+-]?(d*.)?d+/gm

예시

  • 실수 패턴
      /[+-]?(d*.)?d+/
    숫자 가장 앞에 + 또는 -는 붙을 수도 있고 붙지 않을 수도 있습니다. 문자 클래스로 +와 -를 찾고 ?를 붙여 옵션으로 만들어줍니다. 소숫점이 있는 경우라면 중간에 한 개의 .이 존재합니다. .25와 같이 정수부가 0인 경우 생략하는 경우도 있기 때문에 0개 이상의 숫자와 .을 그룹으로 만들고 옵션으로 만들어줍니다. 마지막으로 1개 이상의 숫자를 찾습니다.

참고

이 글은 시작하는 글이기 때문에 backward reference, lookahead등의 내용은 다음 글에서 설명할 예정입니다.

여기에서 정규 표현식을 쓰고 바로 테스트 해 볼 수 있습니다. 여기에서는 정규표현식을 알아보기 쉽게 시각화가 가능합니다.