상세 컨텐츠

본문 제목

[자바] 정규식 regex을 표현하는 Pattern 클래스_ (Matcher /matches 메서드)

java_자바

by 쫑메이 2020. 8. 29. 00:31

본문

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 


[자바] 정규식을 표현하는Pattern 클래스


 

 

 

java.util.regex.Pattern 클래스

- 정규 표현식 패턴 문자열을 컴파일해서 객체로 관리

- 해당 객체를 활용하여 전체 문자열이 정규 표현식 전체에 부합되는지 매칭 판별

 

 

 

 

 

 

 

 

 

 

 


[자바] 정규식을 표현하는 

Pattern 클래스_ 활용


 

 

 

1. 전화번호 검증

전화번호 검증에 사용할 정규 표현식 작성

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자리로 끝

 

 

 

 

 

 

 

 

 

 

 

 

 


[자바] 정규식을 표현하는Pattern 클래스의

matches() 메서드


 

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 + " : 잘못된 번호 형식입니다!");

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


[자바] 정규식을 표현하는 Pattern _

Matcher 클래스

 


 

 

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활용한 문제


 

 

 

 

<<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;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

ㅣ읽느라 수고 많으셨어요~ㅣ

 

 

 

 

 

 

 

 

 

 


 

 

 


 

 

 

 

 

 

 

 

 

부족한 글을 읽어주셔서 감사드립니다

 

아직 부족한 게 많으니

틀린 곳이 있다면

조언의 말씀 꼭 부탁드립니다!!!!

 

 

 

 

 

 

 


 

 

반응형

관련글 더보기