Development record of developer who study hard everyday.

레이블이 안드로이드 정규표현식인 게시물을 표시합니다. 모든 게시물 표시
레이블이 안드로이드 정규표현식인 게시물을 표시합니다. 모든 게시물 표시
, , ,

안드로이드 정규표현식, Pattern, Matcher 클래스 알아보기

안드로이드 정규표현식, Pattern, Matcher 클래스 알아보기

안드로이드

안드로이드에서 아이디나 비밀번호 유효성 검사를 진행할 때, 정규표현식을 사용한다.

대게 아래와 같은 방식으로 진행이 된다.

Pattern과 Matcher 클래스
String 형식으로 된 정규표현식을 Pattern 클래스를 활용해 객체화한다.

Pattern 클래스는 Matcher 객체를 만들 수가 있고 정규표현식의 matching 결과가 Matcher 클래스에 담긴다.

그럼 Pattern 클래스와 Matcher 클래스에 대해 공부해보자.


Pattern 클래스

- 주요 메서드

compile(String regex) : 주어진 정규표현식을 pattern으로 만든다.

matcher(CharSequence input) : 만든 pattern과 match시킬 Matcher 객체를 만든다.

asPredicate() : 문자열과 match시킬 Predicate 객체를 만든다.

pattern() : 컴파일된 정규표현식을 반환한다.

split(CharSequence input) : 문자열을 주어진 인자값 CharSequence 패턴에 따라 분리한다.


Matcher 클래스

matches() : pattern이 대상 문자열과 일치하면 true

find() : pattern이 대상문자열과 일치하면 true, 그리고 그 위치로 이동

find(int start) : matcher를 reset하고 start부터 일치하는 pattern 찾기 시작

start() : 이전 match의 시작 인덱스 반환

start(int group) : 이전 match의 결과에서 주어진 group 안의 첫 인덱스 반환

end() : 매치된 가장 마지막 글자의 offset 반환

end(int group) : 이전 match의 결과에서 주어진 group 안의 마지막 글자의 offset 반환

group() : 매칭된 string 반환

group(int group) : 매칭 결과에서 주어진 group의 string 반환

groupCount() : 매칭된 결과의 group 개수 반환


정규표현식

<문자>

x : 특정 문자

\\ : 백슬래시 문자

\t : 탭

\n : 개행

\r : 캐리지 리턴

\f : form-feed 문자

\a : alert(bell) 문자

\e : escape 문자(esc)


<문자 집합>

[abc] : a,b or c

[^abc] : a,b, or c 제외한 모든 문자

[a-zA-Z] : 영문(대소문자 포함)

[a-d[m-p]] : a부터 d 또는 m부터 p

[a-z&&[def]] : d, e 또는 f

[a-z&&[^bc]] : a 부터 z 인데 b와 c는 제외

[a-z&&[^m-p]] : a 부터 z인데 m부터 p는 제외 


<이미 정의된 문자 집합>

. : 아무 문자

\d : 숫자 (= [0-9])

\D : 숫자 아닌 문자 (=[^0-9])

\s : 공백

\S : 공백 아닌 문자 (=[^\s])

\w : 알파벳이나 숫자 (=[a-zA-Z_0-9])

\W : 알파벳이나 숫자 제외한 문자 (=[^\w])

\b : 단어의 경계

\B : 단어가 아닌 것들의 경계


<수량 한정자>

X? : X가 한 번 또는 아예 안나옴

X* : X가 0번 이상

X+ : X가 한 번 이상

X{n} : X가 정확히 n번

X{n,} : X가 적어도 n번 이상

X{n,m} : X가 적어도 n번 이상 m번 이하


<논리 연산자>

XY  : X 뒤에 Y

X|Y : X 또는 Y

(X) : X 그룹


<그룹으로 만들기>

정규표현식에서는 ()로 그룹을 만든다.

그룹의 순서는 열린괄호( 순이다.

ex) ((A)(B(C))) 

Share:
Read More
, , , , ,

안드로이드 자바 비밀번호 유효성 검사 예제 코드

안드로이드 자바 비밀번호 유효성 검사 예제 코드

안드로이드 개발

회사에서 기존 프로젝트 유지보수를 맡았다.

KISA에서 보안점검?이 나왔는데 보안정책을 강화하라는게 주요 내용이였다.

그 중에 주목할만한 내용이 비밀번호 유효성 검사 강화였다.

안드로이드를 자바로 처음 공부할 때 정규표현식에 대해서 한 번 훑어본 적만 있었지 제대로 써본 적이 없었다.

이번 기회에 제대로 정규표현식을 써보면서 공부한 것들을 기록해본다.

public class ValidationUtil {
public static final String pwdPattern = "^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[~!@#$%^&*()_+])[A-Za-z[0-9]~!@#$%^&*()_+]{8,20}$";    //1
public static final String sameCharacterPattern = "(\\w)\\1\\1";    //2
public static final String continuousKeyboardPattern = "qwe|wer|ert|rty|tyu|yui|uio|iop|asd|sdf|dfg|fgh|ghj|hjk|jkl|zxc|xcv|cvb|vbn|bnm";    //3

public static Boolean validateDefaultRule(String pwd) {    //1
Matcher defaultMatch = Pattern.compile(pwdPattern).matcher(pwd);    //비교를 위한 Matcher 인스턴스 생성
if (!defaultMatch.find()) return false;
else return true;
}

public static Boolean validateSameCharacterPattern(String pwd) {    //2
Matcher samePwdMatch = Pattern.compile(sameCharacterPattern).matcher(pwd);
if(samePwdMatch.find()) return false;
else return true;
}

public static Boolean validateContinuousKeyboardPattern(String pwd) {    //3
Matcher continuousKeyboardMatch = Pattern.compile(continuousKeyboardPattern).matcher(pwd);
if(continuousKeyboardMatch.find()) return false;
else return true;
}
}

비밀번호 유효성 검사를 할 때마다 사용하는 정규표현식과 유효성 검사 함수를 


1 => 영문 대소문자, 숫자, 특수문자 포함 8~12자리

2 => 같은 단어(영어 or 숫자) 3번 이상

3 => 키보드 상의 나란히 배열된 단어 3자


👉 개인적으로 구글링하면서 "3: 키보드 상의 나란히 배열된 단어 3자"의 정규표현식이 쇼킹했다. ㅋㅋ

어떻게 저 내용을 정규표현식으로 작성할 수 있을까? 고민했는데 그냥 노가다로 처리하는걸 보고서 놀랐다. ㅋㅋㅋㅋ

근데 다시금 생각해보니까 짜피 경우의 수가 그리 많지 않아서 노가다로 적어주는게 훨씬 깔끔하다고 생각했다.


👀👀 이외의 많이 쓰이는 정규표현식

public static final String pattern1 = "^(?=.*[A-Za-z])(?=.*[0-9])(?=.*[$@$!%*#?&])[A-Za-z[0-9]$@$!%*#?&]{8,20}$"; //영문, 숫자,특수문자 8~20자리
public static final String pattern2 = "^[A-Za-z[0-9]]{10,20}$"; //영문, 숫자 10자 ~ 20자
public static final String pattern3 = "^[[0-9]$@$!%*#?&]{10,20}$"; //영문, 특수문자 10~20자
public static final String pattern4 = "^[[A-Za-z]$@$!%*#?&]{10,20}$"; //특수문자, 영문 10~20자


/**
* 연속 문자, 숫자 4자리 체크
* => 개인적으로 이해해보려고했는데 그냥 포기했다;;
* @param pwd
* @return
*/

public boolean continuousPwd(String pwd) {
int o = 0;
int d = 0;
int p = 0;
int n = 0;
int limit = 4;    //만약 연속 문자나 숫자 3자리면 4 => 3

for (int i = 0; i < pwd.length(); i++) {

char tempVal = pwd.charAt(i);
if (i > 0 && (p = o - tempVal) > -2 && (n = p == d ? n + 1 : 0) > limit - 3) {
return true;
}
d = p;
o = tempVal;
}

return false;
}


차라리 위의 코드보다 내가 생각했을 땐 아래 정규표현식이 더 직관적이고 깔끔한 것 같다.

public static final String continuousWordPattern = "abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|vwx|wxy|xyz|012|123|234|345|456|567|678|789";

ㅋㅋㅋ 노가다지만 이게 더 보는 사람 입장에서 이해가 쉬워서 좋다.


                                         

위의 코드를 참고해서 변형하면 실무에서 비밀번호나 아이디 유효성 검사는 왠만큼 커버가 가능할거라고 생각한다.


이제 좀 더 본질적으로 정규표현식으로 유효성 검사를 할 때 사용하는 Pattern 클래스와 Matcher 클래스에 대해서 알아보자.











Share:
Read More