java.util.regex.Pattern 클래스
- 정규 표현식 패턴 문자열을 컴파일해서 객체로 관리
- 해당 객체를 활용하여 전체 문자열이 정규 표현식 전체에 부합되는지 매칭 판별
전화번호 검증에 사용할 정규 표현식 작성
String phoneRegex = "^(010|011)[-\\s]?\\d{3,4}[-\\s]?\\d{4}$";
^(010|011) => 010 또는 011로 시작
[-\s]? => - 기호 또는 공백이 있을 수도 있고 없을 수도 있음
\d{3,4} => 숫자 3자리~4자리
[-\s]? => - 기호 또는 공백이 있을 수도 있고 없을 수도 있음
\d{4}$ => 숫자 4자리로 끝
String phone = "010-1234-5678";
Pattern 클래스의 matches() 메서드 사용하여 판별
파라미터 : 정규표현식 문자열, 검증할 원본 문자열 리턴 타입 : boolean
=> 해당 원본 문자열이 정규표현식에 부합되는지 리턴
boolean result = Pattern.matches(phoneRegex, phone);
System.out.println(phone + " 검증 결과 : " + result);
if(Pattern.matches(phoneRegex, phone)) {
System.out.println(phone + " : 정상적인 번호 형식입니다!");
} else {
System.out.println(phone + " : 잘못된 번호 형식입니다!");
}
Matcher 클래스는 패턴을 해석하고 입력 문자열에 대해 일치하는지 파악하는 역할을 수행
Pattern과 마찬가지로 공개된 생성자가 없으며 Pattern의 Matcher()를 통해 얻을 수 있다.
Pattern은 간단한 문자열이 정규표현식에 부합하는지만 확인할 수 있지만
Matcher 클래스는 문자열이 정규 표현식의 내용을 가지고 있는지 위치는 어디인지 자세한 정보를 알 수 있다
- Pattern.matcher() 메서드를 사용하여 Matcher 객체 리턴 받을 수 있음
(공개된 생성자가 없으므로 객체 직접 생성 불가)
String src = "Java and Javascript has no relation";=>원본 문자열
String regex = "Java";=>정규 표현식
1. Pattern 클래스의 compile() 메서드를 호출하여 Pattern 객체 생성
=> 파라미터 : 정규표현식 문자열
Pattern pattern = Pattern.compile(regex);
2. 생성된 Pattern 객체의 matcher() 메서드를 호출하여 Matcher 객체 생성
=> 파라미터 : 검증할 원본 문자열
Matcher matcher = pattern.matcher(src);
3. 각종 메서드를 호출하여 검증 수행
3-1. matches() 메서드 : 정규표현식에 완전히 일치하는지 검사
System.out.println("문자열이 정규표현식에 완전히 부합되는가? " +matcher.matches());
3-2. lookingAt() : 정규 표현식으로 시작하는지 검사
System.out.println("문자열이 정규 표현식으로 시작하는가? " +matcher.lookingAt());
3-3. find() : 정규 표현식을 포함하는지 검사==>실제 패스워드 검증하는데 많이 쓰임
System.out.println("문자열이 정규 표현식을 포함하는가? " +matcher.find());
<<Pattern 클래스와 Matcher 클래스를 활용하여
입력된 패스워드에 대한 규칙(복잡도) 검사>>
규칙 1. 패스워드 길이 : 영문자, 숫자, 특수문자(!@#$%) 조합 8자리 ~ 16자리
규칙 2. 영문자(대, 소문자), 숫자, 특수문자(!@#$%) 중 2가지 이상 조합
=> 4가지 모두 조합 시 : 안전
=> 3가지 조합 시 : 보통
=> 2가지 조합 시 : 미흡
=> 1가지 사용 : 사용 불가능한 패스워드
영문자(대문자 또는 소문자) 판별 정규표현식
String engRegex = "[A-Za-z]";
영문 대문자와 소문자를 별도로 구분하여 판별하는 정규표현식
String engUpperRegex = "[A-Z]"; -> 대문자
String engLowerRegex = "[a-z]"; ->소문자
String numRegex = "[0-9]"; -> 숫자를 판별하는 정규표현식
String specRegex = "[!@#$%]"; ->특수문자(!@#$%) 판별하는 정규표현식
패스워드 길이를 판별하는 정규표현식
=> 영문자(대문자, 소문자), 숫자, 특수문자(!@#$%) 조합 8 ~ 16자리로 시작하고 끝
String lengthRegex = "^[A-Za-z0-9!@#$%]{8,16}$";
String[] passwords = {"Abcde123!", "abcde123@", "abcde123", "12345678", "abcde 한글!"};
Pattern.matches() 메서드를 호출하여 패스워드가 길이 규칙에 일치하는지 출력
for(String password : passwords) {
if(Pattern.matches(lengthRegex, password)) {
패스워드 길이 체크를 통과했을 경우
System.out.println(password + " : 길이 규칙 적합!");
각 패턴(영문 대문자, 소문자, 숫자, 특수문자)이 포함되는지를 각각 검사
=> 검사 결과를 포인트화하여 패스워드 등급 계산하기 위해 변수 필요
int count = 0;
검사할 정규 표현식으로 Pattern 객체 생성 및 Pattern 객체로 Matcher 객체 생성
Pattern pattern = Pattern.compile(engUpperRegex); // 대문자 검사 정규표현식
Matcher matcher = pattern.matcher(password); // 검사할 문자열
Matcher 객체의 find() 메서드로 해당 정규 표현식이 포함되는지를 검사하여
포함될 경우 포인트(count) 1 증가시킴
if(matcher.find()) {
count++;
}
Pattern 객체 생성과 Matcher 객체 생성 및 find() 메서드 호출을 하나로 결합
=> 주의! 각 정규표현식 판별 문장을 else if로 처리하면 안 된다!
각각의 점수를 합산해야 하므로 모든 조건을 따로 판별해야 함
if(Pattern.compile(engUpperRegex).matcher(password).find()) {
count++;
}
if(Pattern.compile(engLowerRegex).matcher(password).find()) {
count++;
}
if(Pattern.compile(numRegex).matcher(password).find()) {
count++;
}
if(Pattern.compile(specRegex).matcher(password).find()) {
count++;
}
삼항연산자를 사용하여 표현하는 방법
=> 판별 결과가 true 이면 1 더하기, 아니면 0 더하기
count += Pattern.compile(engUpperRegex).matcher(password).find() ? 1 : 0;
count += Pattern.compile(engLowerRegex).matcher(password).find() ? 1 : 0;
count += Pattern.compile(numRegex).matcher(password).find() ? 1 : 0;
count += Pattern.compile(specRegex).matcher(password).find() ? 1 : 0;
점수를 판별하여 패스워드 복잡도 검사 결과 출력
switch (count) {
case 4 :
System.out.println(password + " : 안전!");
break;
case 3 :
System.out.println(password + " : 보통!");
break;
case 2 :
System.out.println(password + " : 미흡!");
break;
default :
System.out.println(password + " : 사용 불가능한 패스워드!");
break;
}
ㅣ읽느라 수고 많으셨어요~ㅣ
부족한 글을 읽어주셔서 감사드립니다
아직 부족한 게 많으니
틀린 곳이 있다면
조언의 말씀 꼭 부탁드립니다!!!!
[자바] DTO /DAO_insert/update/delete/select (0) | 2020.08.30 |
---|---|
[자바] 정규 표현식( Regular Expression,‘regexp') 패턴/ 메타 문자 (0) | 2020.08.26 |
[자바] 형식화 클래스_ DecimalFormat 클래스/메소드/toString (0) | 2020.08.25 |
[자바] 예외 처리(2) throws /throw 왜 쓸까?/ 위임/ Exception/일부러 발생시키는 오류 (0) | 2020.08.24 |
[JAVA] 자바_누적 함수/ 별만들기/짝수,홀수(반복문for문/if문 조건문) (0) | 2020.08.23 |