JAVA - 정규식

최봉진·2022년 3월 16일
0

프로그래머스 - 신규 아이디 추천 문제를 풀다가 정규식에 대해 공부해 봤다.

문제의 조건은 다음과 같다.

new_id 라는 문자열이 매개변수로 주어지고 다음 7단계의 조건을 만족시킨 추천아이디 값을 반환하는 문제이다.

  1. 우선 new_id 를 id라는 String형 변수에 넣고 진행했다.(계속해서 new_id를 치고 싶지 않아서..) 1단계에서 대문자를 소문자로 치환하라고 했기 때문에 id.toLowerCase();를 사용했다.

  2. 여기서 정규식을 사용했는데 알파벳 소문자, 숫자, - , _ , . 를 제외한 모든 문자를 제거하라고 한다. 그래서 ("[^-_.a-z0-9]", "") 정규식을 사용했다. 정규식 앞에 .replaceAll을 사용한다.
    (1) [^]는 not을 나타낸다. 즉 안의 내용이외의 것.
    (2) - 빼기, _ 밑줄, . 점, a-z 알파뱃 소문자, 0~9 숫자를 의미한다.
    (3) 위의 두가지를 합쳐보면 위의 조건에 부합되지 않는 문자를 찾는다는 의미가 된다. 그것을 "" 즉 없애달라는 의미다.

  3. 3단계 조건을 보면 마침표가 연속 2개 이상이면 1개로 치환하라고 한다. ("[.]{2,}", ".") 의 정규식을 사용했다.
    (1) [] 하나의 문자를 나타낼 때 사용한다. [.] 이기 때문에 . 하나를 뜻한다.
    (2) {}안에는 반복을 나타내는데 {n, m}하면 n개부터 m개 까지다. 우리는 2개 이상이라고 했기 때문에 {2,}로 지정한다.
    (3) 2번까지의 정규식을 이용해 2개이상의 연속된 마침표가 있다면 "." 한개로 바꿔준다.

  4. 마침표가 처음이나 끝에 있으면 제거한다. ("^[.] | [.]$","") 정규식을 사용했다.
    (1) ^ 는 문자열의 시작을 의미한다. 즉 ^[.] 마침표로 시작하는지 확인한다.
    (2) | 파이프라인 기호는 or 연산을 수행한다.
    (3) $는 문장의 끝을 의미한다. 즉 [.]$ 는 마침표로 끝나는지 확인한다.
    (4) 위의 정규식을 통해 마침표가 처음이나 끝에 있으면 ""를 통해 없애준다.

  5. 만약 id가 빈 문자열이라면 "a"를 대입해 준다. if문과 equals로 값을 비교해 a문자를 넣어준다.

  6. id의 길이가 16자 이상이면 처음 15개까지의 문자만 추출한다. 후에 마침표가 가장 마지막에 있으면 마침표를 제거한다. if문을 이용해 .length로 문자열의 길이를 비교한다. substring을 이용해 문자열을 15개로 자르고, ("[.]$", "") 정규식을 이용해 마지막 마침표를 없애준다.

  7. 만약 id의 길이가 2글자 이하라면 id의 마지막 문자를 id의 길이가 3이 될 때까지 반복한다.
    if문과 .length를 이용해 길이를 비교하고 조건에 충족되면 while문을 이용해 길이가 3이 될 때까지 charAt함수를 이용해 마지막 글자를 붙여준다.

위의 과정을 반복해 문제를 푼 코드는 다음과 같다.

class Solution {
    public String solution(String new_id) {
        String answer = "";
        String id = new_id;
        
        id = id.toLowerCase();
        id = id.replaceAll("[^-_.a-z0-9]", "");
        id = id.replaceAll("[.]{2,}", ".");
        id = id.replaceAll("^[.]|[.]$", "");
        
        if(id.equals("")) id += "a";
        
        if(id.length() >= 16){
            id = id.substring(0, 15);
            id = id.replaceAll("[.]$", "");
        }
        if(id.length() <= 2){
            while(id.length() < 3){
                id += id.charAt(id.length()-1);
            }
        }
        answer = id;
        
        System.out.print(String.valueOf(id));
        return answer;
    }
}

미니 프로젝트 때 id와 비밀번호 생성에서도 정규식을 사용했었는데 java에서는 처음 사용해 봤다. 조금 생소하지만 한번 사용방법을 알아두면 유용하게 사용할 수 있을 것 같다.

profile
개발자가 되고픈 비전공자

0개의 댓글

Powered by GraphCDN, the GraphQL CDN