본문 바로가기

Java 길찾기/이것이 자바다

[Java] 기본 API 클래스 - 정규 표현식과 Pattern

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

 

정규 표현식 작성 방법

정규 표현식을 작성하는 방법은 API 도큐먼트에서 java.util.regex.Pattern 클래스를 찾아 Summary of regular=expression constructs를 참조하면 되는데, 이해하기 쉽지 않다. 간단히 말해서 정규 표현식은 문자 또는 숫자 기호와 반복 기호가 결합된 문자열이다. 다음은 정규 표현식을 작성하는데 기본적으로 알아두어야 할 기호들에 대한 설명이다.

 

기호 설명
[ ] 한 개의 문자 [abc] a, b, c 중 하나의 문자
[^abc] 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개까지
( ) 그룹핑

 

다음은 02-123-1234 또는 010-1234-5678과 같은 전화번호를 위한 정규 표현식이다.

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

 

다음은 name@email.com과 같은 이메일을 위한 정규 표현식이다.

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

 

주의할 점은 \.과 .은 다른데, \.은 문자로서의 점( . )을 말하지만 .은 모든 문자중에서 한 개의 문자를 뜻한다.

 

Pattern 클래스

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

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

첫 번째 매개값은 정규 표현식이고, 두 번째 매개값은 검증할 문자열이다. 검증 후 결과가 boolean 타입으로 리턴된다. 다음 예제는 전화번호와 이메일을 검증하는 코드를 보여준다.

// PatternExample.java -- 문자열 검증하기
public class PatternExample {
    public static void main(String[] args) {
        String regExp = "(02|010-\\d{3,4}-\\d{4})";
        String data = "010-123-4567";
        boolean result = Pattern.matches(regExp, data);
        if(result) {
            System.out.println("정규식과 일치합니다.");
        } else {
            System.out.println("정규식과 일치하지 않습니다.");
        }
        
        regExp = "\\w+@\\w+\\.\\w+(\\.\\w+)?";
        data = "name@emailcom"
        result = Pattern.matches(regExp, data);
        if(result) {
            System.out.println("정규식과 일치합니다.");
        } else {
            System.out.println("정규식과 일치하지 않습니다.");
        }
    }
}

이메일 검증에서 일치하지 않는 이유는 emailcom이라고 되어 있기 때문이다. 반드시 점( . )과 한 개 이상의 알파벳 또는 숫자가 포함되어야 하므로 email.com 이라고 해야 맞다.