프로그래머스
이번 문제는 해결하지 못해 프로그래머스에서 다른 분이 작성하신 정규표현식 풀이법을 단계별로 정리해보았습니다.
function solution(new_id) {
const answer = new_id
.toLowerCase() // 1단계
.replace(/[^\w-_.]/g, '') // 2단계
.replace(/\.+/g, '.') // 3단계
.replace(/^\.|\.$/g, '') // 4단계
.replace(/^$/, 'a') // 5단계
.slice(0, 15).replace(/\.$/, ''); // 6단계
return answer.padEnd(3, answer[answer.length-1]); // 7단계
}
1단계
new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
toLowerCase()
2단계
new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄, 마침표(.)를 제외한 모든 문자를 제거합니다.
replace(searchValue: string|RegExp, replaceValue: string)
replace(/[^\w-_.]/g), ''
첫번째 인자로 교체 대상이 되는 문자열 또는 정규식을 입력받고, 두번째 인자로 교체되어 들어갈 문자열을 입력받아 교체된 문자열을 리턴한다.
정규식은 /정규식/
의 형태로 작성한다.
[]
안에 들어가는 문자열은 문자셋이라고 하고, .
, *
도 특수문자 취급받지 않고 문자로 취급된다.
[^문자셋]
와 같이 문자열이 문자셋이 ^
로 시작하면, 부정 문자셋을 의미하며, 뒤에 나오는 문자셋을 제외한 문자가 대응된다.
\w
는 [A-Za-z0-9_]
와 동일하며 영문자(소문자, 대문자), 숫자, 밑줄을 포함한다.
/정규식/g
는 정규식 뒤에 붙는 문자는 검색옵션을 지정할 수 있다. g
는정규식에 해당하는 문자를 한번만 찾고 끝나는게 아니라 조건에 맞는 모든 문자를 찾을 수 있다.
3단계
new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
replace(/\.+/g, '.')
\.
은 이스케이프 문자 \
과 함께 사용해 마침표 .
특수문자가 아닌 문자열로서 사용할 수 있습니다. ([]
안에서는 이스케이프 없이 사용가능)
+
는 +
기호 앞 문자가 1회 이상 반복되는 것을 의미한다.
4단계
new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
replace(/^\.|\.$/,'')
^
이 문자셋 안에서 사용되면 부정의 의미를 가졌지만, //
에서 사용되면 시작을 의미한다. |
는 '또는'(or)의 의미를 갖는다.$
는 끝을 의미한다. $
앞에 쓰인 문자로 끝나는지를 확인한다.5단계
new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.'
replace(/^$/, 'a')
//
안에서 ^
는 시작을 의미하며 $
는 끝을 의미한다. 따라서, 시작과 끝 사이에 아무 문자열도 없는 경우 'a'를 대입한다. 6단계
new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다. 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
slice(0,15).replace(/\.$/,'')
slice
한다.slice
한 후에 마침표로 끝나면 마지막 마침표를 제거한다. 7단계
new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
return answer.padEnd(3, answer[answer.length-1])
padEnd(목표 길이, 추가할 문자열)
은 문자열의 끝에 목표 길이가 될때까지 반복한다. padStart
는 문자열의 시작에 목표 길이가 될때까지 반복한다.