# 정규표현식

문자열이 정해져 있는 형식(정규표현식 : Regular Expression)으로 구성되어 있는지 검증해야하는 경우가 있다. 예를 들어, 이메일, 전화번호를 사용자가 제대로 입력했는지 검증해야할 때 정규표현식과 비교한다.

## 작성 방법

[API 문서](https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html) 를 참조하면 되는데, 이해하기가 쉽지 않다. 간단히 말해서 정규 표현식은 **문자 또는 숫자 기호와 반복 기호가 결합된 문자열**이다.

| 기호        | 설명                                       |
| --------- | ---------------------------------------- |
| \[]       | 한 개의 문자                                  |
| \[abc]    | a,b,c 중 하나의 문자                           |
|           | a,b,c 이외의 하나의 문자                         |
| \[a-zA-Z] | a\~z, A\~Z중 하나의 문자                       |
| \d        | 한 개의 숫자, \[0-9]와 동일                      |
| \s        | 공백                                       |
| \w        | 한 개의 알파벳 또는 한 개의 숫자, \[a-zA-Z\_0-9]와  동일 |
| ?         | 없음 또는 한 개                                |
| \*        | 없음 또는 한 개 이상                             |
| +         | 한 개 이상                                   |
| {n}       | 정확히 n개                                   |
| {n,}      | 최소한 n개                                   |
| {n,m}     | n개에서 m개 까지                               |
| ()        | 그룹핑                                      |

정규 표현식을 작성하는데 기본적으로 알아 두어야할 기호들이다.

* [http://www.nextree.co.kr/p4327/](http://www.nextree.co.kr/p4327/) 에 기호에 대해서 잘 설명되어 있다.

### 전화번호

02-111-1111 , 010-1111-1111와 같은 전화번호를 위한 정규식이다.

```java
(02|010)-\d{3,4}-\d{4}
```

| 기호        | 설명            |
| --------- | ------------- |
| (02\|010) | 02 또는 010     |
| -         | - 포함          |
| \d{3,4}   | 3자리 또는 4자리 숫자 |
| -         | - 포함          |
| \d{4}     | 4자리 숫자        |

### 이메일

example@aaa.xx과 같은 이메일을 위한 정규표현식이다.

```java
\w+@\w+\.\w+(\.\w+)?
```

| 기호         | 설명                          |
| ---------- | --------------------------- |
| \w+        | 한 개 이상의 알파벳 또는 숫자           |
| @          | @                           |
| \w+        | 한 개 이상의 알파벳 또는 숫자           |
| `\.`       | .                           |
| \w+        | 한 개 이상의 알파벳 또는 숫자           |
| `(\.\w+)?` | `\.\w+` 이 없거나 한 번 더 올 수 있다. |

여기서 `\.` 은 문자로서의 점을 말하고, `.` 은 모든 문자 중에서 한 개의 문자를 뜻한다.

## Pattern 클래스

문자열을 정규 표현식으로 검증하는 기능은 java.util.regex.Pattern 클래스의 정적 메소드인 matches() 메소드가 제공한다.

```java
boolean result = Pattern.matches("정규식", "검증할 문자열");
```

```java
//예제
String regExp = "(02|010)-\\d{3,4}-\\d{4}";
String data = "010-1111-1111";
boolean result = Pattern.matches(regExp,data);

if(result){
    System.out.println("정규식과 일치합니다.");
}else{
    System.out.println("정규식과 일치하지 않습니다.");
}
```
