정규 표현식이란 문자열 데이터 중 원하는 조건 (패턴) 과 일치하는 문자열 부분을 찾아내기 위해 사용하고 정규식을 사용하면 입력형식을 지정해줄 수 있고, 입력된 데이터가 형식에 맞는지를 확인 할 수 있다는 장점이 있다.
(주민번호, 이메일과 같이 정해진 형식이 있고 그 형식을 올바르게 따랐는지를 검증해야할 때 유용하게 사용할 수 있다. )
String 문자열에 바로 정규표현식을 적용하여 필터링이 가능하다.
boolean matches(String regex) : 인자로 주어진 정규식에 매칭되는 값이 있는지 확인
String replaceAll(String regex , String s) : 문자열 내의 정규식 regex 와 매치되는 문자열을 임의의 문자열 s로 바꾼 문자열 반환
String[ ] split(String regex) : 인자로 주어진 정규식을 기준으로 문자열을 쪼갠다.
프로그래머스 신규 아이디 추천
https://school.programmers.co.kr/learn/courses/30/lessons/72410
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;
}
}
메서드 해결 방법은 이런 방법이 있다 참고하여 응용할 수 있도록 하자
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;
}
}
}