안드로이드/Kotlin

[Kotlin] Password 정규식

block_626 2022. 9. 29. 15:52

개인 프로젝트중 회원가입 관련해서 비밀번호를 어떻게 처리 해야하는지 의문이 들었습니다.

우리가 보통 회원가입을 하게되면 아이디 또는 이메일을 입력 후 비밀번호를 입력하는데 비밀번호를 생성할때 '영문포함 8글자이상', '영문, 특수문자 포함 10글자 이상' 등등의 정규식을 통과 후 알맞게 비밀번호가 입력이 되었다면 회원가입이 진행되었습니다.

이번 포스팅에는 비밀번호 입력 시 정규식을 어떻게 사용할 것 인지 공부 해보겠습니다.


Pattern

compile(String regex) : 주어진 정규표현식으로부터 패턴을 만듭니다.
matcher(CharSequence input) : 대상 문자열이 패턴과 일치할 경우 true를 반환합니다.
asPredicate() : 문자열을 일치시키는 데 사용할 수있는 술어를 작성합니다.
pattern() : 컴파일된 정규표현식을 String 형태로 반환합니다.
split(CharSequence input) : 문자열을 주어진 인자값 CharSequence 패턴에 따라 분리합니다.

Matcher

matches() : 대상 문자열과 패턴이 일치할 경우 true 반환합니다.
find() : 대상 문자열과 패턴이 일치하는 경우 true를 반환하고, 그 위치로 이동합니다.
find(int start) : start위치 이후부터 매칭검색을 수행합니다.
start() : 매칭되는 문자열 시작위치 반환합니다.
start(int group) : 지정된 그룹이 매칭되는 시작위치 반환합니다.
end() : 매칭되는  문자열 끝 다음 문자위치 반환합니다.
end(int group) : 지정되 그룹이 매칭되는 끝 다음 문자위치 반환합니다.
group() : 매칭된 부분을 반환합니다.
group(int group) : 매칭된 부분중 group번 그룹핑 매칭부분 반환합니다. 
groupCount() : 패턴내 그룹핑한(괄호지정) 전체 갯수를 반환합니다.

 

정규 표현식 관련한 문자

표현식                                              설명
^ 문자열의 시작
$ 문자열의 종료
. 임의의 한 문자 (문자의 종류 가리지 않음,  단, \ 는 넣을 수 없음)
* 앞 문자가 없을 수도 무한정 많을 수도 있음
+ 앞 문자가 하나 이상
? 앞 문자가 없거나 하나있음
[] 문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타낸다. []내에서 ^가 선행하여 존재하면 not 을 나타낸다.
{} 횟수 또는 범위를 나타낸다.
() 소괄호 안의 문자를 하나의 문자로 인식 
| 패턴 안에서 or 연산을 수행할 때 사용
\s 공백 문자
\S 공백 문자가 아닌 나머지 문자
\w 알파벳이나 숫자
\W 알파벳이나 숫자를 제외한 문자
\d 숫자 [0-9]와 동일
\D 숫자를 제외한 모든 문자
\ 정규표현식 역슬래시(\)는 확장 문자. 역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고 역슬래시 다음에 특수문자가 오면 그 문자 자체를 의미
(?i) 앞 부분에 (?i) 라는 옵션을 넣어주면 대소문자를 구분하지 않음

자주 사용하는 정규식

  • 숫자만 : ^[0-9]*$
  • 영문자만 : ^[a-zA-Z]*$
  • 한글만 : ^[가-힣]*$
  • 영어 & 숫자만 : ^[a-zA-Z0-9]*$
  • 비밀번호 (숫자, 문자 포함 6~12자리 이내) : ^[A-Za-z0-9]{6,12}$
  • 비밀번호 (숫자, 문자, 특수문자 포함 8~15자리 이내) : ^.*(?=^.{8,15}$)(?=.*\d)(?=.*[a-zA-Z])(?=.*[!@#$%^&+=]).*$
  • 이메일 : ^[a-zA-Z0-9]+@[a-zA-Z0-9]+$
  • 휴대폰 : ^\\d{3}-\\d{3,4}-\\d{4}$
  • 일반전화 : ^\\d{2,3}-\\d{3,4}-\\d{4}$
  • 주민등록번호 : \d{6} \- [1-4]\d{6}
  • IP 주소 : ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3})
  • 파일확장자 : ^\\S+.(?i)(txt|pdf|hwp|xls)$
  • 이중 파일확장자 : (.+?)((\\.tar)?\\.gz)$

위의 내용을 토대로 비밀번호 정규식을 적용시켜 보겠습니다.

val pwPattern1 = "^[0-9]*\$" // 숫자만
val password = "123123aa"

val pattern = Pattern.compile(pwPattern1)

val matcher = pattern.matcher(password)

Log.d("password", matcher.matches().toString())

간단한 숫자만 true가 나오는 정규식을 사용해보겠습니다.

정규식은 숫자만 가능한데 password는 숫자오 영문이 섞여있습니다.

val pattern = Pattern.compile(pwPattern1)

여기서 Pattern.compile을 사용하여 위에서 주어진 정규표현식으로부터 패턴을 만듭니다.

val matcher = pattern.matcher(password)

패턴을 만들어준 정규식에 입력해줄 password를 matcher해주게 되면 정규식 검사를 합니다.

실행시켜 Log에 찍힌 값을 확인해보면

2022-09-29 15:25:46.662 23928-23928/com.duran.testapp D/password: false

false가 찍히는것이 확인이 됩니다.

정규식은 숫자만 입력인데 입력한 값은 숫자와 영문이 섞여있기 때문에 true가 아닌 false가 나왔습니다.

이번엔 정규식에 맞게 입력하게되면 

val pwPattern1 = "^[0-9]*\$" // 숫자만
val password = "123123"

val pattern = Pattern.compile(pwPattern1)

val matcher = pattern.matcher(password)

Log.d("password", matcher.find().toString())
2022-09-29 15:49:47.151 26037-26037/com.duran.testapp D/password: true

true값이 나오는 것이 확인됩니다.

 

이렇게 사용하고자 하는 정규식 패턴을 사용해 비밀번호 입력을 커스텀해보면 좋을거 같습니다!