PS/Tip

문자열 (String).replaceAll()과 정규식

소재훈 2021. 9. 12. 00:17

카카오 2021 블라인드 테스트 에서도 나왔듯이 카카오 코딩테스트에서는 문자열 문제가 자주나온다. 이러한 유형의 문제를 Java로 풀때 손쉽게 풀 수 있는 replaceAll 메서드와 정규식에 대해서 알아보자.

 

코드 부터 살펴보면 위 링크에 있는 문제는 다음과 같이 해결하였다.

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

프로그램을 살펴보면 중간에 replaceAll()메서드와 함께 사용한 정규식을 관찰할 수 있다. replaceAll()메서드는 replace()메서드와는 다르게 첫번째 인자 값에 정규식이 들어간다. 그리고 해당 정규식에 해당하는 문자, 문자열을 두번째 인자의 것으로 바꾸어주는 것이다.

 

정규식은 다음과 같은 규칙으로 사용할 수 있다.

 

매칭될 문자 지정 또는 제외

정규식 설명
[abc] a, b, c중 하나이면 일치한다.
[^abc] a, b, c를 제외한 다른 글자이면 일치한다.
[a-zA-Z] a 부터 z까지 또는 A부터 Z까지의 알파벳 중 하나라면 일치한다.
[a-d[m-p]] a부터 d까지, 또는 m부터 p까지 중에 하나와 일치합니다. ([a-dm-p], 합집합)
[a-z&&[def]] d, e, f 중의 하나와 일치합니다. (교집합)
[a-z&&[^bc]] b 와 c를 제외한 a부터 z까지 중의 하나와 일치합니다. ([ad-z], 차집합)
[a-z&&[^m-p]] m부터 p까지를 제외한, a부터 z까지 중의 하나와 일치합니다. ([a-lq-z], 차집합)

더 자세한 내용은 여기를 참조하면 된다. 문자열 문제에서 적극적으로 활용하도록 하자.