# 정규 표현식 기초
## 메타문자
메타 문자(meta characters)는 특별한 의미를 갖는 문자이다. 대표적 예로 아래와 같은 것들이 있다. 이들에 대한 내용을 하나씩 살펴보자.
```
[ ] . * + { } | - ^ ? \ ( ) ...
```
## 문자 클래스 [ ]
문자 클래스(`[ ]`)는 대괄호 사이에 들어간 문자를 찾는다. 예를들어 [aeiou]라는 표현식은 모음을 찾는 패턴으로 "a, e, i, o, u 중 한 개"라는 의미다. 아래는 Ruby를 사용한 정규식 예이다.
```
// a, b, c 중 한개라도 포함되어있는가? (가장 먼저 찾은 문자를 반환)
"Do you like dogs?".match(/[abc]/) // nil
"Do you like cats?".match(/[abc]/) // "c"
```
## 범위
하이픈(`-`)을 사용하면 "두 문자 사이의 범위"를 뜻한다.
```
# 숫자를 포함하는가?
"Happy New Year 2018".match(/[0-9]/) // "2"
```
## 자주사용하는 문자 클래스
빈번하게 등장하는 메타문자는 아래와 같다.
```
// 숫자
\d // [0-9]: isDigit?
\D // [^0-9]: ! isDigit?
// 공백
\s // [ \t\n\r\f\v]: isWhiteSpace?
\S // [^ \t\n\r\f\v] ! isWhiteSpace?
// 문자
\w // [a-zA-Z0-9]: isCharacter?
\W // [^a-zA-Z0-9]: ! isCharacter?
```
## Dot: 임의의 한 글자
```
"1aaaa 5a5 bbbb2".match(/\d.\d/) // "5a5"
```
## 반복
```
// + : 1 or more
// * : 0 or more
// ? : 0 or 1
// {3, 5} : between 3 and 5
```
## 시작과 끝
```
// ^ : beginning of line
"Regex are cool".match(/^\w{4}/)
# => Rege
// $ : end of line
"Regex are cool".match(/\w{4}$/)
# => cool
```
## 캡처 그룹
특정 패턴을 묶어서 추출하는 방법.
```
// 첫 번째 그룹 추출
m = "John 31".match /\w+ (\d+)/
m[1]
# => 31
```
이름을 지정할 수 있음
```
m = "David 30".match /(?<name>\w+) (?<age>\d+)/
m[:age]
# => "30"
m[:name]
# => "David"
```
## 레퍼런스
+ Mastering Ruby RegEx(http://www.rubyguides.com/2015/06/ruby-regex/)