Java - 정규표현식,Pattern,Matcher

2020. 7. 2. 22:36Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
import java.util.regex.Pattern;
 
public class Ex3 {
 
    public static void main(String[] args) {
        /*
         * 정규표현식을 활용하는 클래스
         * 1. java.util.regex.Pattern 클래스
         *    - 정규표현식 패턴 문자열을 컴파일해서 객체로 관리
         *    - 해당 객체를 활용하여 전체 문자열이 정규표현식 전체에 부합되는지 매칭 판별
         *    - ex) 전화번호 형식 검증, 패스워드 길이 형식 검증 등
         *          => 단, 패스워드 복잡도 검사(부분 규칙 검사) 불가 
         *    - 공개된 생성자가 없으며, Pattern.compile() 메서드를 통해 객체 리턴받아 사용
         *    
         * 2. java.util.regex.Matcher 클래스
         */
        
        // --------------- Pattern 클래스 활용 --------------- 
        // 1. 전화번호 검증
        // 1-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자리로 끝
         */
        
        String phone = "010-1234-5678";
        
        // 1-2) 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 + " : 잘못된 번호 형식입니다!");
        }
        
        
        
    }
 
}
 
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class Ex4 {
 
    public static void main(String[] args) {
        
        /*
         * 2. java.util.regex.Matcher 클래스
         * 패턴 해석 및 입력 문자열 일치 여부를 파악하는 클래스
         * Pattern 클래스와 달리 정규표현식 일치 여부만 판단하는 것이 아니라
         * 정규표현식 내용을 포함하는지, 위치가 어디인지 등 자세한 정보까지 파악가능
         * 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());
        
 
    }
 
}
 
 
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class Test4 {
    public static void main(String[] args) {
 
        /*
         * 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 s:passwords) {
            if(Pattern.matches(lengthRegex, s)) {
                //패스워드 길이 체크를 통과했을 경우
//                System.out.println(s+" : 길이 규칙 일치");
                //각 패턴(영문 대,소문자, 숫자,특수문자)이 포함되는지를 각각 검사
                //검사 결과를 포인트화하여 패스워드 등급 계산하기 위해 변수 필요
                int count=0;
                
                //검사할 정규표현식으로 Pattern 객체 생성 및 Pattern 객체로 Matcher 객체 생성
//                Pattern pattern=Pattern.compile(engUpperRegex);//대문자 검사 정규표현식
//                Matcher matcher=pattern.matcher(s);//검사할 문자열
                //Matcher 객체의 find() 메서드로 해당 정규표현식이 포함되는지를 검사하여
                //포함될 경우 포인트(count) 1 증가
//                if(matcher.find()) {
//                    count++;
//                }
//                
                // Pattern 객체 생성과 Matcher 객체 생성및 find()메서드 호출을 하나로 결합
                // 주의!!@#!@# 각 정규표현식 판별 문장을 else if로 처리하면 안된다!
                // 각각의 점수를 합산해야하므로 모든 조건을 따로 판별해야함
//                if(Pattern.compile(engUpperRegex).matcher(s).find()) {
//                    count++;
//                }
//                if(Pattern.compile(engLowerRegex).matcher(s).find()) {
//                    count++;
//                }
//                if(Pattern.compile(numRegex).matcher(s).find()) {
//                    count++;
//                }
//                if(Pattern.compile(specRegex).matcher(s).find()) {
//                    count++;
//                }
                
                //여러개의 if문을 한개의 if문으로 합치기(OR 연산자활용)
//                if(Pattern.compile(engUpperRegex).matcher(s).find()
//                        ||Pattern.compile(engLowerRegex).matcher(s).find()
//                        ||Pattern.compile(numRegex).matcher(s).find()
//                        ||Pattern.compile(specRegex).matcher(s).find()) {
//                    count++;
//                }
                
                
                //삼항연산자를 사용하여 표현하는 방법
                //판별 결과가 true이면 1더하기 ,아니면 0 더하기
                count+= Pattern.compile(engUpperRegex).matcher(s).find()?1:0;
                count+= Pattern.compile(engLowerRegex).matcher(s).find()?1:0;
                count+= Pattern.compile(numRegex).matcher(s).find()?1:0;
                count+= Pattern.compile(specRegex).matcher(s).find()?1:0;
                
                //점수를 판별하여 패스워드 복잡도 검사결과 출력
                switch (count) {
                case 4:
                    System.out.println(s+" : 안전");
                    break;
                case 3:
                    System.out.println(s+" : 보통");
                    break;
                case 2:
                    System.out.println(s+" : 미흡");
                    break;
                default : 
                    System.out.println(s+" : 사용불가능한 패스워드");
                    break;
 
                
                }
                
            }else {
                //패스워드 길이 체크를 통과하지 못했을 경우
                System.out.println(s+" : 영문자or숫자or특수문자 조합 8~16자리 필수");
            }
        }
        
   
    }
}
cs

 

 

정규표현식과 정규표현식을 활용하는 Pattern, Matcher  클래스를 배워보았는데

로그인이나 회원가입 시 꼭 활용되어야 할 중요 클래스와 개념들이어서 집중해서 보았는데

여러 메서드들을 활용해서 로그인이나 회원가입 시 꼭 필요한 기준을 정해 놓은 후 거기에 사용자가 적은 데이터 값이

포함되는지와 같은 여러 상황들에 맞춰 활용해 보았고 정규표현식과 Pattern, Matcher 클래스를 활용해서 회원가입 시 필요한 패스워드 검사를 해보았는데 조건문을 활용해야 하는데 다른 방식들과 다르게 if문을 활용할 경우 코드가 길어지고 각각의 조건들을 따로따로 검사해야 하기 때문에 if 문을 활용할 수 없고 초기에 배웠던 삼항 연산자를 활용하여서

간단하게 조건식을 정해서 해보았다. 주의할 점이 Pattern을 객체로 생성할 시에는 new Pattern()을 하지 않고

Pattern.compile(정규표현식)을 활용해야 한다는 점이다. 헷갈릴 수 있으니 조심해야 하겠다.

 

'Java' 카테고리의 다른 글

Java - throw,throws  (0) 2020.07.02
Java - 예외(Exception),try~catch  (0) 2020.07.02
Java - SimpleDateFormat,MessageFormat  (0) 2020.07.02
Java- enum  (0) 2020.07.01
Java - Date,time,Calendar  (0) 2020.06.30