Blog

[Spring]45 Validation의 커스터마이즈, 정규 표현식(Regular Expression)

Category
Author
Tags
PinOnMain
1 more property
유효성 검사의 커스터마이즈
기본적으로 제공되는 어노테이션 형태의 유효성 검사로도 기본적인 정규식 패턴이 입력되어 있다. 하지만 개발자가 원하는 정규 표현식 패턴을 구현하려면 정규 표현식을 이해하고 알아 볼 수 있어야 한다.
정규 표현식(Regular Expression)이란?
정규식(Regular Expression)은 문자열에서 특정 내용을 찾거나 대체 또는 발췌하는데 사용되는 것이다.
그 중 애플리케이션에서 자주 활용되는 것은 정규식의 특정 문자, 숫자의 매칭 패턴, 검색 기준 패턴, 갯수 반복 패턴 정도는 익숙해져야 한다. 외우지 못하더라도 다른 식을 보고 어느정도 파악할 수준은 익숙해지면 시간을 낭비하지 않을 수 있다.
Spring에서는 @Pattern 이라는 어노테이션을 통해서 해당 필드의 유효성 검사에 정규 표현식을 적용 시킬 수 있다.
예시로 Email 형식 : 계정@도메인.최상위도메인 처럼 나타내고 싶다면, 다음과 같이 커스터마이즈 하여 보다 세밀한 조정을 할 수 있다.
@Pattern(regexp = "^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$") @NotBlank private String email;
Java
복사
이외에 아래 참고 사이트를 통해서 다양한 예제들을 수집해두었다.
정규식 실무 예제
특정 단어로 끝나는지 검사
const fileName = 'index.html'; // 'html'로 끝나는지 검사 // $ : 문자열의 끝을 의미한다. const regexr = /html$/;
Java
복사
숫자로만 이루어져 있는지 검사
const targetStr = '12345'; // 모두 숫자인지 검사 // [] 바깥의 ^는 문자열의 처음을 의미한다. const regexr = /^\d+$/;
Java
복사
아이디 사용 검사
const id = 'abc123'; // 알파벳 대소문자 또는 숫자로 시작하고 끝나며 4 ~10자리인지 검사 // {4,10}: 4 ~ 10자리 const regexr = /^[A-Za-z0-9]{4,10}$/;
Java
복사
핸드폰 번호 형식
const cellphone = '010-1234-5678'; const regexr = /^\d{3}-\d{3,4}-\d{4}$/;
Java
복사
웹사이트 주소 형식
const text = `http://dogumaster.com http://google.com 010-1111-2222 02-333-7777 curryyou@aaa.com`; text.match(/https?:\/\/[\w\-\.]+/g); // ["http://dogumaster.com", "http://google.com"] /* 1) http => 로 시작하고, 2) s? => 다음에 s는 없거나, 있고, 3) \/\/ => 다음에 특수기호 // 가 오고 4) [\w\-\.]+ => \w(영문자, 언더스코어), 하이픈, 쩜 으로 이루어진 문자열이 한개 이상(+) 있다. 5) g => 매칭되는걸 모두 다 찾는다.(플래그) */
Java
복사
전화번호 형식
const text = `http://dogumaster.com http://google.com 010-1111-2222 02-333-7777 curryyou@aaa.com`; text.match(/\d{2,3}-\d{3,4}-\d{4}/g); // [ '010-1111-2222', '02-333-7777' ] /* 1) \d{2,3} => 숫자 2~3개로 시작하고, 2) \- => 다음에 하이픈(-)이 오고 3) \d{3, 4} => 다음에 숫자가 3~4개 오고, 4) \- => 다음에 하이픈(-)이 오고, 5) \d{4} => 다음에 숫자가 4개 온다. 6) g => 매칭되는걸 모두 다 찾는다(플래그) */
Java
복사
이메일주소 형식
const text = `http://dogumaster.com http://google.com 010-1111-2222 02-333-7777 curryyou@aaa.com`; text.match(/[\w\-\.]+\@[\w\-\.]+/g); // [ 'curryyou@aaa.com' ] // 좀더 엄격한 검사가 필요하다면, 상황에 맞게 수정해서 사용면 된다. const email = 'ungmo2@gmail.com'; const regexr = /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/;
Java
복사
특수기호 정규표현식
// 모든 특수기호를 나열 const regex = /\[\]\{\}\/\(\)\.\?\<\>!@#$%^&*/g // 문자와 숫자가 아닌것을 매칭 const regex = /[^a-zA-Z0-9-힣ㄱ-]/g
Java
복사
이밖의 정규표현식 모음
/* 전화번호 */ var localPhone = /^(0(2|3[1-3]|4[1-4]|5[1-5]|6[1-4]))(\d{3,4})(\d{4})$/; var cellPhone = /^(?:(010\d{4})|(01[1|6|7|8|9]-\d{3,4}))(\d{4})$/; /* 숫자 형식 */ var number = /[0-9]/; var unsignedInt = /^[1-9][0-9]*$/; var notNumber = /[^(0-9)]/gi; /* 문자 형식 */ var korea_cv = /[-|-]/; var korea = /[-]/; var koreaName = /[-]/; var english = /[a-z | A-Z]/; /* 특문 */ var special_char = /[\{\}\[\]\/?.,;:|\)*~`!^\-+<>@\#$%&\\\=\(\'\"]/; var comma_char = /,/g; var blank = /[\s]/g; /* 아이디 / 비밀번호 */ var id_check = /^[a-z | A-Z]{3,6}[0-9]{3,6}$/; var password =/^.*(?=.{6,20})(?=.*[0-9])(?=.*[a-zA-Z]).*$/; /* 이메일 형식 */ var email =/([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/; /* 도메인 형식 */ var domain_all =/([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.) |(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/; var domain_include = /^((http(s?))\:\/\/)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/; var domain_exclude = /^[^((http(s?))\:\/\/)]([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/; /* 영문 한글만 */ var ko_en_num_charactor = /^[-힣a-zA-Z0-9]*$/; var ko_en_charactor = /^[-힣a-zA-Z]*$/; /* 자동차 번호판 */ var car = /^[0-9]{2}[\s]*[-]{1}[\s]*[0-9]{4}$/; var old_car = /^[-]{2}[\s]*[0-9]{2}[\s]*[-]{1}[\s]*[0-9]{4}$/;
Java
복사
정규식 패턴 참고용 웹사이트
정규식 특정 문자 숫자 매칭 패턴
패턴
의미
a-zA-Z
영어알파벳(-으로 범위 지정)
ㄱ-ㅎ가-힣
한글 문자(-으로 범위 지정)
0-9
숫자(-으로 범위 지정)
.
모든 문자열(숫자, 한글, 영어, 특수기호, 공백 모두)단, 줄바꿈 X
\d
숫자
\D
숫자가 아닌 것
\w
밑줄 문자를 포함한 영숫자 문자에 대응[A-Za-z0-9_] 와 동일
\W
\w 가 아닌 것
\s
space 공백
\S
space 공백이 아닌 것
\특수기호
특수기호 \* \^ \& \! \? ...등
\b
63개 문자(영문 대소문자 52개 + 숫자 10개 + _(underscore))가 아닌 나머지 문자에 일치하는 경계(boundary)
\B
63개 문자에 일치하는 경계
\x
16진수 문자에 일치/\x61/는 a에 일치
\0
8진수 문자에 일치/\141/은 a에 일치
\u
유니코드(Unicode) 문자에 일치/\u0061/는 a에 일치
\c
제어(Control) 문자에 일치
\f
폼 피드(FF, U+000C) 문자에 일치
\n
줄 바꿈(LF, U+000A) 문자에 일치
\r
캐리지 리턴(CR, U+000D) 문자에 일치
\t
탭 (U+0009) 문자에 일치
정규식 검색 기준 패턴
기호
의미
|
ORa|b
[]
괄호안의 문자들 중 하나. or 처리 묶음 보면 된다./abc/ : "abc"를 포함하는/[abc]/ : "a" 또는 "b" 또는 "c" 를 포함하는[다-바] : 다 or 라 or 마 or 바
[^문자]
괄호안의 문자를 제외한 것[^lgEn] "l" "g" "E" "N" 4개 문자를 제외※ 대괄호 안에서 쓰면 제외의 뜻, 대괄호 밖에서 쓰면 시작점 뜻
^문자열
특정 문자열로 시작 (시작점)/^www/
문자열$
특정 문자열로 끝남 (종착점)/com$/
정규식 갯수 반복 패턴
기호
의미
?
없거나 or 최대 한개만/apple?/
*
없거나 or 있거나 (여러개)/apple*/
+
최소 한개 or 여러개/apple+/
*?
없거나, 있거나 and 없거나, 최대한개 : 없음{0}와 동일
+?
최소한개, 있거나 and 없거나, 최대한개 : 한개{1}와 동일
{n}
n개
{Min,}
최소 Min개 이상
{Min, Max}
최소 Min개 이상, 최대 Max개 이하{3,5}? == {3}와 동일
정규식 그룹 패턴
기호
의미
()
그룹화 및 캡쳐
(?: 패턴)
그룹화 (캡쳐 X)
(?=)
앞쪽 일치(Lookahead),/ab(?=c)/
(?!)
부정 앞쪽 일치(Negative Lookahead),/ab(?!c)/
(?<=)
뒤쪽 일치(Lookbehind),/(?<=ab)c/ 
(?<!)
부정 뒤쪽 일치(Negative Lookbehind),/(?<!ab)c/