function solution(new_id) {
let answer = new_id
.toLowerCase() // 1. 대문자 => 소문자
.replace(/[^a-z0-9-_.]/g, "") // 2. 형식x 문자 제거
.replace(/\.+/g, ".") // 3. 마침표 2개 이상 => 1개
.replace(/^\.|\.$/g, "") // 4. 처음이나 마지막 마침표 제거
// 5. 빈문자열 => 'a'
if(answer === ''){
answer = 'a'
}
answer = answer.slice(0,15).replace(/\.$/, "") // 6. 15개 제한 if 15번째 = 마침표 => 제거
// 7. 2자 이하 => 마지막 문자 추가해서 3 만들어줌
while(answer.length < 3 ){
answer += answer[answer.length - 1]
}
return answer
}
2단계:
- []: []안에 있는 정규표현식과 일치하면
- ^: 제외하고 → [^a-z0-9-_.] : a-z , 0-9, -, _ , 를 제외하고
- /g: 전체
3단계:
- \.+ : 마침표가 1개이상이면
4단계:
- [] 밖에서 ^ : 첫번째 → \. : 첫번째가 마침표
- | : or
- $: 마지막 → \.$: 마지막이 마침표
5번에서 체이닝이 끊겼는데 안 끊고 구현할 수도 있었다... 생각을 못했다.... 아래 코드는 다른 분의 코드!
function solution(new_id) {
const answer = new_id
.toLowerCase() // 1단계
.replace(/[^\w-_.]/g, '') // 2단계
.replace(/\.+/g, '.') // 3단계
.replace(/^\.|\.$/g, '') // 4단계
.replace(/^$/, 'a') // 5단계
// .padEnd(1, 'a') // 5단계 다른 방법
.slice(0, 15).replace(/\.$/, ''); // 6단계
const len = answer.length;
return len > 2 ? answer : answer + answer.charAt(len - 1).repeat(3 - len); // 7단계
}
2단계:
- /w : [^A-Za-z0-9_]
- 위 풀이에서는 [^\w-_.] 으로 풀었는데 _ 는 /w 에 이미 포함되어 있으므로 [^/w-.] 로 작성해도 충분
5단계 다른 방법:
- ^$: 아무것도 없음
5단계 체이닝을 아무것도 없으면 'a' 로 치환하는 정규식 방법을 보고 오... 했는데 .padEnd 라는 방법은 아예 처음봤다.
- padEnd( targetLength [, padString] ) : 현재 string의 length가 targetLength보다 작으면 그대로 return, 크면 padString을 뒤부터 채워서 return
- 그래서 answer이 빈 문자열일 때 padEnd(1, 'a') 를 쓰면 length가 1보다 작기 때문에 'a' 로 채운다.
- padStart( targetLength [, padString] ) : padEnd 와 같은 매커니즘인데 앞에서부터.
정규식은 항상 문제가 닥칠 때마다 구글링해서 작업하고 있는데, 언제 한 번 공부해서 자주 쓰는 부분은 외워놓으면 좋을 것 같다.
<MDN 정규식 링크>
반응형
'알고리즘 > javascript' 카테고리의 다른 글
[프로그래머스] 코딩테스트연습 > 키패드 누르기 (0) | 2021.10.11 |
---|---|
[프로그래머스] 코딩테스트연습 > 숫자 문자열과 영단어 (0) | 2021.09.30 |
[프로그래머스] 코딩테스트연습 > 로또의 최고 순위와 최저 순위 (0) | 2021.09.29 |
[프로그래머스] 코딩테스트연습 > 완전탐색 > 모의고사 (0) | 2021.09.27 |
[프로그래머스] 코딩테스트연습 > 정렬 > K번째 변수 (0) | 2021.09.25 |