외주 작업했던 것을 정리를 해야되서 이 공간을 빌어 정리한다.
회원가입을 할 때, 제약조건을 넣게 된다.
예를 들면, 아이디는 8~14 길이제한, 숫자와 영문자로만 이루져야한다.
라고 한다면, 길이제한이야 string의 길이를 체크하면 그만이다.
하지만 특수문자 체크를 한다면 특수문자 하나하나에 if문을 넣어 체크할 수도 없는 노릇이다.
그 때, 우리가 사용해야할 게 바로 정규식(Regular Expression)이다.
C#에서는 System.Test.RegularExpressions 를 포함시켜 Regex라는 클래스를 사용하면 된다.
Regex Expression에는 메타문자라는 게 존재하는데, 이 메타문자를 이용해서 가능한 문자 혹은 불가능한 문자들을 설정하는 등의 작업을 할 수 있다.
그 외에도 치환, 문자열 분리(split) 등등 다양한 작업을 할 수 있다.
이 글에서는 외주 작업으로 했던 특정 양식에 맞는지 체크에서 사용했던 내용을 위주로 다루겠다.
일단 메타문자를 살펴보면
^ : ^뒤에 오는 문자로 시작
[ ] : 괄호 안의 문자 중 하나
[^ ] : 괄호 안의 문자 중에서 ^는 부정
[ - ] : 가능한 문자 범위를 지정할 때는 하이픈(-)을 이용
{} : 앞 문자열 출현 횟수 체크. "콤마를 사용할 때, 스페이스를 쓰면 안됨({1 , 4} (X))
(예) a{1,4}b => a가 1~4회 출현, ab, aab, aaab, aaaab
$ : $앞 문자(열)로 끝나야함
위 메타문자들을 가장 많이 사용했다.
예시 코드를 보며 살펴보자.
//아이디 체크
Regex regex = Regex(@"^[0-9a-zA-Z]{1,100}$");
숫자,영어를 포함한 1~100사이의문자열
$를 끝에 사용해서 숫자,영어로 끝나야만 한다.
//비밀번호 체크(스택오버플로우를 참고하여 작업했던 것 같다)
Regex regex = new Regex(@"^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[\W]).{8,20}$");
?=는 전방탐색을 의미
.은 임의의 한 문자를 의미
영어 대,소문자 하나 이상
숫자 하나 이상
\W는 특수문자열들을 의미 [^a-zA-Z0-9]와 같은 의미. 특수문자열 하나 이상
인 문자열이 8~20자
결과적으로 영대,소, 숫자, 특수문자 1개이상을 포함한 비밀번호 8~20자
//휴대폰 체크
Regex regex = new Regex(@"010-[0-9]{4}-[0-9]{4}$")
010 - XXXX - XXXX 형식의 전화번호
이런 식으로 입력 폼 체크를 했었다.
참고로 휴대폰 체크에서 정규식 끝에 $를 붙이냐 안붙이냐로 발생할 수 있는 큰 문제점이 있는데
010-[0-9]{4}-[0-9]{4} 이렇게 사용했을 경우, 010-2222-33334444는 isMatch함수가 true를 반환한다.
그 이유는 "010-2222-3333"4444 에서 따옴표 친 부분이 정규식에 매치되기 때문이다.
이러한 부분을 방지하기 위해서는 끝에 $를 붙여서 [0-9]{4} 로 끝나게 만들어주면 된다.
정규식을 많이 사용해보거나 테스트를 꼼꼼하게 하는 방법 밖에 없을 것 같다.
설명이 많이 부족한 것 같지만, 작업했던것 위주로만 한번 정리해보았다.
틀린게 있으면 댓글로 알려주세요.