내가 지피티 도움받아 짠거… 어렵 뭐 까다롭네.. 문자열, 정규식 연습하기 딱이ㅏㄷ
class Solution {
public String solution(String new_id) {
//if(new_id.matches("[a-z\-_\.]{3,15}&\.{0}[^\.{2,}]\.{0}"))
if(new_id.matches("[a-z0-9_.-]{3,15}")
&& !new_id.startsWith(".")
&& !new_id.endsWith(".")
&& !new_id.contains("..")){
return new_id;
}
new_id = new_id.toLowerCase();
// new_id = new_id.replace("^[a-z0-9_-.]","");
new_id = new_id.replaceAll("[^a-z0-9_.-]", ""); // 허용되지 않는 문자 제거
// new_id = new_id.replace("..",".");
new_id = new_id.replaceAll("\\.+", "."); // 점이 2개 이상 연속 → 점 1개
//여기서 "."는 정규식에서 임의의 한 문자라는 뜻이라, 처음 문자가 점(.)이 아니더라도 제거될 수 있습니다!
//new_id = new_id.startsWith(".") ? new_id.replaceFirst(".","") : new_id;
new_id = new_id.startsWith(".") ? new_id.replaceFirst("\\.", "") : new_id;
new_id = new_id.endsWith(".") ? new_id.substring(0,new_id.length()-1) : new_id;
new_id = new_id.isEmpty() ? "a" : new_id;
new_id = new_id.length()>=16 ? new_id.substring(0,15) : new_id;
new_id = new_id.endsWith(".") ? new_id.substring(0,new_id.length()-1) : new_id;
new_id = new_id.length() <= 2 ? repeat(new_id) : new_id;
return new_id;
}
private String repeat(String id){
StringBuilder sb = new StringBuilder(id);
char c = id.charAt(id.length()-1);
while(sb.length() != 3){
sb.append(c);
}
return sb.toString();
}
}
- 왜 이스케이프에 백스페이스를 두번하는가?
- 자바에서도 escape sequence 역할을 하기 때문.
\\-은 [] 내부에서는 특수기호라서 . 과 다르게 이스케이프처리를한다.\\.인건 . 이 특문이라서 이스케이프 위함임
- 자바에서도 escape sequence 역할을 하기 때문.
class Solution {
public String solution(String new_id) {
new_id = new_id.toLowerCase();
new_id = new_id.replaceAll("[^a-z0-9_.-]", ""); // 허용되지 않는 문자 제거
new_id = new_id.replaceAll("\\.+", "."); // 점이 2개 이상 연속 → 점 1개
new_id = new_id.replaceAll("^\\.+|\\.+$", "");
new_id = new_id.isEmpty() ? "a" : new_id;
if(new_id.length() >= 16){
new_id = new_id.substring(0,15);
new_id = new_id.replaceAll("\\.+$","");
}
while(new_id.length()<3){
new_id += new_id.charAt(new_id.length()-1);
}
return new_id;
}