Java 정규표현식 사용하기(Regular Expression)
일반적으로 클라이언트로부터 입력되는 데이터에 대한 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)