Programming/Java

Java 정규표현식 사용하기(Regular Expression)

Jan92 2022. 9. 7. 22:08

Java 정규표현식

일반적으로 클라이언트로부터 입력되는 데이터에 대한 validation은 프론트엔드에서 먼저 처리됩니다. 하지만 악의적인 의도로 프론트를 거치지 않고 유효성에 대한 검사가 이뤄지지 않은 데이터를 서버에 직접 보내게 된다면 문제가 발생할 수 있는데요. 때문에 서버 역시 들어오는 데이터에 대한 validation 처리가 필요한 것입니다.

 

 

 

1. 정규표현식(Regular Expression)이란?

정규식은 프로젝트 개발에 있어서 빠지지 않고 사용되는 부분으로 "특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어"라고도 표현되는데요. 정규표현식은 이메일, 휴대폰 번호, 주민번호 등의 형식이나 비밀번호 같이 입력값이 정해진 형식에 맞는지 검증해야 할 때 유용하게 사용됩니다.

 

정규표현식을 사용할 때 이해를 하고 사용하기보다는 그냥 필요한 정규식을 찾아서 복사 붙여 넣기 하여 사용하는 경우가 많은데요.

앞서 이야기한 것처럼 개발에 있어서 빠지지 않고 사용되는 부분이기 때문에 한 번쯤 제대로 이해해두고 사용하면 수정이 필요할 때나 정규식 관련 오류가 발생했을 때 원인을 빠르게 파악하여 수정할 수 있습니다.

 

이어지는 내용에서는 정규표현식의 문법에 대한 내용과 정규식의 간단한 예시 및 실제로 사용되는 정규표현식에 대해서 알아보겠습니다.

 

 

 

2. 정규표현식 문법

Regular Expression Description
^ 문자열의 시작
$ 문자열의 끝
. 임의의 문자 1개를 의미
* 문자가 0번 이상 반복
+ 문자가 1번 이상 반복
? 문자가 0번 혹은 1번

 

Regular Expression Description
[ ] 문자의 집합 범위를 의미
[0-9] 숫자 0부터 9
[a-z] 알파벳 a부터 z
[a-zA-Z] 알파벳 a부터 z + 알파벳 A부터 Z
[a-zA-Z0-9] 알파벳 a부터 z + 알파벳 A부터 Z + 숫자 0부터 9
[^a-z] 알파벳 a부터 z가 아닌 것
(앞에 ^ 가 붙어있을 경우 not을 의미)

 

Regular Expression Description
{ } 문자가 나오는 횟수를 의미
{x} 앞의 문자가 정확히 x번 나옴
{x, } 앞의 문자가 적어도 x번 나옴
{x,y} 앞의 문자가 최소 x번 나오고, 최대 y번 까지 나옴

 

Regular Expression Description
( ) 소괄호 안의 문자를 하나의 문자로 인식(Grouping)
| or 조건
\ 확장문자 (*아래 추가 설명 참고)

 

Regular Expression Description
\b 단어의 경계
\B 단어가 아닌 것의 경계
\s 공백문자(whitespace)
\S 공백문자가 아닌 나머지 문자
(whitespace를 제외한 문자)
\w 알파벳이나 숫자, 언더바(_) 기호
\W 알파벳이나 숫자, 언더바(_) 기호를 제외한 문자
\d 숫자 ([0-9]와 동일)
\D 숫자를 제외한 모든 문자

*/

정규표현식에서 역슬래시(\)는 확장 문자를 의미하는데요.

역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고, 역슬래시 다음에 특수문자가 오면 그 문자 자체를 의미합니다.

예를 들어서 알파벳이나 숫자를 나타내는 \w 같은 경우 Java에서 \ 자체를 특수문자로 취급하기 때문에 \\w와 같이 작성해야 합니다.

/*

(해당 부분은 아래 예시에서도 한번 더 언급하겠습니다.)

 

 

 

3. 간단한 예시 및 실제로 사용되는 정규표현식

^[0-9]*$               // 숫자가 0번 이상 반복 
=> ^는 문자열의 시작, [0-9]는 숫자, *는 0번 이상 반복, $는 문자열의 끝 

^[a-zA-Z]*$            // 영문자가 0번 이상 반복
=> ^는 문자열의 시작, [a-zA-Z]는 영문자, *는 0번 이상 반복, $는 문자열의 끝

^([a-z]+[0-9]*)$       // 영어 소문자가 꼭 포함되어야 하며, 숫자가 있어도 된다.
=> ^는 문자열의 시작, [a-z]는 소문자, +는 1번 이상 반복, [0-9]는 숫자, *는 0번 이상 반복, $는 문자열의 끝

^([a-z]+[0-9]{0,3})$   // 영어 소문자가 꼭 포함되어야 하며, 숫자는 최소 0번에서 최대 3번까지 나올 수 있다.
=> 나머지 동일 + {0,3}는 최소 0번에서 최대 3번 까지 반복

(간단한 예시)

 

^\w+@\w+\.\w+(\.\w+)?$
// 이메일

^\d{2,3}-\d{3,4}-\d{4}$          
// 전화번호 (ex 02-1234-5678)

^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$    
// 휴대폰번호 (ex 010-1234-5678 | 011-123-4567)

^\d{6}\-[1-4]\d{6}$
// 주민번호

^\d{3}-\d{2}$
// 우편번호 (ex 123-45)

(실제로 사용되는 정규식)

 

^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$
// 최소 8자리에 숫자, 문자, 특수문자 각 1개 이상 포함

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$
// 최소 8자리에 대문자, 소문자, 숫자 각 1개 이상 포함

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,}
// 최소 8자리에 대문자, 소문자, 숫자, 특수문자 각 1개 이상 포함

// ?= 는 전방 탐색 기호로 (?=.*[a-z]) 소문자가 1개 이상 들어갔는지 확인하는 부분

(실제로 사용되는 비밀번호 정규식)

 

/*

한번 더 언급하자면 자바에서는 역슬래시(\) 자체를 특수문자로 취급하기 때문에 \d, \w로 쓰이는 부분이 java 내부에서는 \\d, \\w 가 되어야 정상적으로 동작합니다.

*/

 

 

 

4. Java 정규표현식 사용 예시

자바에서 정규표현식을 작성하여 확인하기 위해서는 java.util.regex 패키지에 있는 Pattern 클래스 또는 Matcher 클래스를 사용하게 되는데요. Matcher 클래스는 Patten 클래스와 비슷하지만 더 많은 비교 관련 메서드를 제공한다는 특징이 있습니다.

+ requestDto에서 @Pattern 어노테이션을 통한 정규식 확인도 가능합니다.

 

(내용이 길어져 Pattern, Matcher 클래스에 대해서는 간단한 사용 예시만 첨부해놓았습니다.)

 

String str = "abcdef9!@#";

if (!Pattern.matches("^[a-zA-Z]*$", str)) {
    System.out.println("no match!");
}

(Pattern Class)

 

Pattern pattern = Pattern.compile("^[a-zA-Z]*$");
String str = "abcd";

Matcher matcher = pattern.matcher(str);
System.out.println(matcher.find());   // true

(Matcher Class)

 

 

 

< 참고 자료 >

 

Java - 정규표현식(regex), 다양한 예제로 쉽게 이해하기

정규표현식(Regular expressions), Regex는 문자열에서 어떤 패턴을 찾는데 도움을 줍니다. Regex의 Metacharacters, Quantifiers, Grouping에 대해서 정리하였고 다양한 예제로 설명합니다. Regex는 대부분 알고 있지

codechacha.com