정규표현식(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등의 내용은 다음 글에서 설명할 예정입니다.
여기에서 정규 표현식을 쓰고 바로 테스트 해 볼 수 있습니다. 여기에서는 정규표현식을 알아보기 쉽게 시각화가 가능합니다.