프로그래머스에 문자열 관련 좋은 문제가 있었다.
문자열을 가공 하는 데 있어서, 정규표현식을 알아두면 편하다.
주어진 문제를 보면, 아이디 생성시 아래의 7단계를 거쳐 규칙의 맞는 아이디를 생성하게 된다
1단계 newid의 모든 대문자를 대응되는 소문자로 치환합니다.
2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(), 마침표(.)를 제외한 모든 문자를 제거합니다.
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
아래의 정규표현식을 이용하여 구현 할 수 있다.
class Solution {
public String solution(String new_id) {
String str = new_id;
//1
// 소문자 변환
str = str.toLowerCase();
//2
// * : 앞문자가 없을 수도, 무한정 많을수도 있음
// ^ : 영어 소문자, 숫자, - _ . 문자 제외한 모든 문자 제거
// \\ : 특정 문자를 뽑아 매칭시킬때 사용
str = str.replaceAll("[^a-z0-9\\-_.]*","");
//3
// 횟수 또는 범위를 나타내는 {2} 2회이상 연속되면 . 으로 치환
str = str.replaceAll("\\.{2,}", ".");
//4
// ^ : 문자시작, | : 이거나 , [.]$ : 문자열 끝이
// ([.] 첫문자나 끝이 . 으로 끝나면 제거)
str = str.replaceAll("^[.]|[.]$", "");
//5
if("".equals(str)) {
str = "a";
}
//6
// 문자길이는 15자 까지며, 제거 후 마침표가 양 끝에 있으면 제거
if(str.length() > 15) {
str = str.substring(0 , 15);
str = str.replaceAll("^[.]|[.]$", "");
}
//7
// 길이가 2자 이하면, 마지막 문자를 붙여서 길이가 3이 될 때까지 반복
if(str.length() < 3) {
while(str.length() < 3) {
//str += str.substring(str.length()-1);
str = str.concat(str.substring(str.length()-1));
}
}
return str;
}
}