자바 정규 표현식

권권·2023년 3월 20일
0

Java Study🎇

목록 보기
3/7
post-thumbnail

정규 표현식이란 문자열 데이터 중 원하는 조건 (패턴) 과 일치하는 문자열 부분을 찾아내기 위해 사용하고 정규식을 사용하면 입력형식을 지정해줄 수 있고, 입력된 데이터가 형식에 맞는지를 확인 할 수 있다는 장점이 있다.

(주민번호, 이메일과 같이 정해진 형식이 있고 그 형식을 올바르게 따랐는지를 검증해야할 때 유용하게 사용할 수 있다. )

정규식 문법 기호 모음

정규식 수량 기호

String 클래스의 정규식 문법

String 문자열에 바로 정규표현식을 적용하여 필터링이 가능하다.

boolean matches(String regex) : 인자로 주어진 정규식에 매칭되는 값이 있는지 확인

String replaceAll(String regex , String s) : 문자열 내의 정규식 regex 와 매치되는 문자열을 임의의 문자열 s로 바꾼 문자열 반환

String[ ] split(String regex) : 인자로 주어진 정규식을 기준으로 문자열을 쪼갠다.

출처 : https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%A0%95%EA%B7%9C%EC%8B%9DRegular-Expression-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%A0%95%EB%A6%AC

예제

프로그래머스 신규 아이디 추천
https://school.programmers.co.kr/learn/courses/30/lessons/72410

해결방법 1 : 정규표현식

1단계 : 모든 대문자를 대응되는 소문자로 치환
==> answer = new_id.toLowerCase();

2단계 : 알파벳 소문자, 숫자, -, , . 만 남겨두고 모두 삭제
==> answer = answer.replaceAll("[^a-z0-9-
.]" , "");

3단계 : 마침표가 2번 연속된 것을 하나의 마침표로 치환
==> answer = answer.replaceAll("//.{2,}" , ".");

4단계 : 마침표가 처음이나 끝에 위치하면 제거
==> answer = answer.replaceAll("^[.]|[.]$" , "");

5단계 : new_id(지금까지의 answer) 가 빈 문자열이면 "a"를 대입
==> answer = answer.equals("") ? "a" : answer;

6단계 - 1 : new_id 의 길이가 16자 이상이면 첫 15개의 문자를 제외하고 나머지 문자 제거
==> answer = answer.length() >= 16 ? answer.substring(0,15) : answer;

6단계 - 2 : 제거 후 마침표가 new_id(answer)의 끝에 위치한다면 끝의 마침표 제거
==> answer = answer.replaceAll("[.]$ , "");

7단계 : new_id(answer)의 길이가 2 이하라면, new_id(answer)의 마지막 문자를 길이가 3이 될 때까지 반복
char a = answer.charAt(answer.length()-1);
if(answer.length() <= 2 ) {while(answer.length() < 3) {answer += a;}}

class Solution {
    public String solution(String new_id) {
        String answer = "";
        
        // 1번
        answer = new_id.toLowerCase();
       
        
        // 2번
        answer = answer.replaceAll("[^0-9a-z-_.]", "");

        
        // 3번
        answer = answer.replaceAll("\\.{2,}", ".");
     
        
        // 4번
        answer = answer.replaceAll("^[.]|[.]$", "");

        
        // 5번
        answer = answer.equals("") ? "a" : answer;
       
        
        // 6-1
        answer = answer.length() >= 16 ? answer.substring(0, 15) : answer;

        
        // 6-2
        answer = answer.replaceAll("[.]$", "");
       
        
        // 7
        char a = answer.charAt(answer.length()-1);
        if(answer.length() <= 2){
            while(answer.length() < 3){
                answer += a;
            }
        }
        return answer;
    }
}

해결방법 2 : 메서드로 해결

메서드 해결 방법은 이런 방법이 있다 참고하여 응용할 수 있도록 하자

class Solution {
    public String solution(String new_id) {
        String s = new KAKAOID(new_id)
            .step1()
            .step2()
            .step3()
            .step4()
            .step5()
            .step6()
            .step7()
            .getResult();
            
        return s;
    }
    
    private static class KAKAOID{
    private String s;
    
    KAKAOID(String s){
        this.s = s;
    }
    
    private KAKAOID step1(){
        s = s.toLowerCase();
        return this;
    }
    
    private KAKAOID step2(){
        s = s.replaceAll("[^a-z0-9._-]", "");
        return this;
    }
    
    private KAKAOID step3(){
        s = s.replaceAll("[.]{2,}", ".");
        return this;
    }
    
    private KAKAOID step4() {
        s = s.replaceAll("^[.]|[.]$", "");
        return this;
    }
    
    private KAKAOID step5(){
        s = s.isEmpty() ? "a" : s;
        return this;
    }
    
    private KAKAOID step6(){
        if(s.length() >= 16){
            s = s.substring(0, 15);
        }
        s = s.replaceAll("[.]$", "");
        return this;
        }
    
    private KAKAOID step7(){
        StringBuilder sBuilder = new StringBuilder(s);
        while (sBuilder.length() <= 2){
            sBuilder.append(sBuilder.charAt(sBuilder.length()-1));
        }
        s = sBuilder.toString();
        return this;
        }
    
    private String getResult(){
        return s;
    }
    }
}



profile
안녕하세요

0개의 댓글