정규 표현식과 Pattern 클래스

이메일, 전화번호 등을 사용자가 제대로 입력했는지 검증해야 할 때 정규 표현식을 사용하는 경우가 있다. 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-4567 또는 010-1234-5678과 같은 전화번호를 위한 정규 표현식.

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

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

이메일 주소인 eomdev@eomdev.com 과 같은 정규 표현식

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

기호 설명
\w+ 한 개 이상의 알파벳 또는 숫자
@ @
\w+ 한 개 이상의 알파벳 또는 숫자
\. . (그냥 .은 모든 문자 중에서 한 개의 문자를 뜻한다)
\w+ 한 개 이상의 알파벳 또는 숫자
(\.\w+)? .한 개 이상의 알파벳 또는 숫자가 없거나 한 번 더 올 수 있음

테스트

import org.junit.Test;
import java.util.regex.Pattern;
import static org.fest.assertions.api.Assertions.assertThat;

public class ApplicationTest {
    
    @Test
    public void testRegExp() throws Exception {

        // given : 테스트 상황을 설정
        String regExp = "(02|010)-\\d{3,4}-\\d{4}";
        String data = "010-1234-5678";
        String data2 = "011-1234-5678";

        // when : 테스트 대상을 실행
        // java.util.regex.Pattern 클래스의 정적 메소드인 matches() 메소드로 검사할 수 있다.
        boolean result = Pattern.matches(regExp, data);

        // then : 결과를 검증
        // fest assert를 이용한 검증
        assertThat(result).isTrue();
        assertThat(data2).matches(regExp);

        
    }
    
}

011 은 정규 표현식에 맞지 않으므로 테스트가 통과되지 않는걸 볼 수 있다.

image1