개인 프로젝트중 회원가입 관련해서 비밀번호를 어떻게 처리 해야하는지 의문이 들었습니다.
우리가 보통 회원가입을 하게되면 아이디 또는 이메일을 입력 후 비밀번호를 입력하는데 비밀번호를 생성할때 '영문포함 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값이 나오는 것이 확인됩니다.
이렇게 사용하고자 하는 정규식 패턴을 사용해 비밀번호 입력을 커스텀해보면 좋을거 같습니다!
'안드로이드 > Kotlin' 카테고리의 다른 글
[Kotlin] Alert Dialog 다이얼로그 띄워보기 (0) | 2022.09.29 |
---|---|
[Kotlin] Splash Screen(로딩 화면) 만들어보기 (0) | 2022.09.28 |
[Kotlin] Toolbar Custom해보기 (0) | 2022.09.28 |
[Kotlin] Splash 화면 만들기 (0) | 2022.08.16 |
[Kotlin] var와 val의 차이점 (0) | 2022.08.06 |