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], 차집합) |
더 자세한 내용은 여기를 참조하면 된다. 문자열 문제에서 적극적으로 활용하도록 하자.