js에서 문자열 다루기
이번에 풀어본 문제의 조건은 다음과 같습니다.
- new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
- new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
- new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
- new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
- new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
- new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다. - new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
1. 대문자 소문자 치환
자바스크립트에서는 대문자를 소문자로 치환해주는 함수가 존재한다.
let str = 'ABC';
let lowerStr = str.toLowerCase(str);
console.log(lowerStr); // abc
2. 조건에 맞는 문자만 필터링
.split('')
을 사용하면 문자열을 배열로 바꿀 수 있습니다.
반대로 .join('')
을 사용하면 배열을 다시 문자열로 바꿀 수 있다. 나는 이를 이용해서 2번을 풀었습니다.
let numberPattern = /[0-9]/;
let engPattern = /[a-z]/;
let specialPattern = /[-_.]/;
let filteredStr = str.split('').filter(word =>
numberPattern.test(word) ||
engPattern.test(word) ||
specialPattern.test(word)
);
정규식의 활용
위에서는 filter
와 간단한 정규식을 가지고 풀이했지만 좀 더 깊게 생각하면 아래와 같이 풀 수 있습니다.
먼저, replace
를 아래와 같이 활용가능합니다.
str.replace(정규식, 정규식에 해당하는 부분 치환)
정규식은 //
으로 시작합니다.
//
뒤에 g
를 붙이면 해당하는 모든 부분이라는 뜻입니다.
//g
[]
를 사용하면 문자를 다룰 수 있습니다.
/[A-Z]/ /* 대문자 영어만 선택 */
/[a-z]/ /* 소문자 영어만 선택 */
/[0-9]/ /* 숫자만 선택 */
/[\w]/ /*대문자, 소문자, 숫자, 밑줄을 선택*/
/[^A-Z]/ /*대문자 영어를 제외하고 선택*/
이를 활용해서 2번을 간결하게 풀이할 수 있습니다.
str.replace(/[^\w-_.]/, '');
3. 연속된 문자를 하나의 문자로 치환
문자 뒤에 +
를 사용하면 해당 문자가 연속된 부분을 나타냅니다.
let str = 'AAA';
str.replace(\A+\, 'A'); // 'A';
정규식에서 .
은 아무 문자를 의미합니다.
let str = 'ASA';
/A.A/.test(str) // true;
/A../.test(str) // true;
/.AA/.test(str) // false;
정규식에서 사용되는 특수문자를 문자로 취급하려면
\ (백 슬래시)
를 앞에 붙여줍니다.
지금까지 내용을 조합해서 조건3 을 정규식으로 풀게되면 아래와 같습니다.
str.replace(/\.+/, '');
4. 앞 뒤에 점 제거하기
정규식에서 ^
은 시작부분을 의미하고 $
는 끝부분을 의미합니다.
Hello minsu, eunsol Hello
과 같은 문장에서
\^Hello\
를 사용하게되면
Hello
minsu, eunsol Hello
위와 같이 첫번째 Hello
만 잡힙니다.
\Hello$\
를 사용하게 되면
Hello minsu, eunsol
Hello
위와 같이 마지막에 있는 Hello
가 잡히게 됩니다.
정규식에서 OR
을 사용하고싶다면 |
문자를 활용하면 됩니다.
이를 이용해서 앞 뒤에 있는 .
를 제거하는 정규식은 다음과 같습니다.
str.replace(/^\.|\.$/, '');
5. 빈 문자열이라면 a 대입
if
를 활용해서 간단하게 풀이할 수 있습니다.
if(str === ''){
str = 'a';
}
정규식을 활용한다면 좀 더 간단하게 풀어낼 수 있습니다.
앞서 ^
는 맨 앞을 의미하고 $
는 맨 뒤를 의미하므로
/^$/
는 공백을 의미합니다.
str.replace(/^$/, 'a');
6. 문자열 길이 자르기
.substr(A, B)
을 활용하면 시작지점 A부터 원하는 길이 B까지 자른 문자열을 반환합니다.
.slice(A, B)
를 활용하면 시작지점 A 부터 끝 지점 B 까지 자른 문자열을 반환합니다.
해당 문제를 풀이하면 아래와 같습니다.
str.substr(0, 15).replace(/\.$/, '');
7. 문자열의 길이가 2 이하라면 끝 문자를 연속해서 붙이기
while
을 사용해서 풀어냈다.
while(str.length <= 2 ){
str = str + str[str.length - 1];
}
repeat
를 활용한 추가 풀이
ECMAScript 2015 명세
에 .repeat()
라는 함수가 추가되었습니다.
함수를 사용하게되면 문자열을 반복해서 뒤에 붙여줍니다.
let str = 'ABC';
console.log(str.repeat(3)) // ABCABCABC
이를 이용해서 7번을 좀 더 간단하게 풀이할 수 있습니다.
let len = str.length;
len > 2 ? str : str + str.charAt(len - 1).repeat(3 - len)
부록 1. padEnd
를 활용한 풀이
ECMAScript 2017
에 새로 추가된 padEnd(A, B)
는
문자열을 목표 문자열 길이 A 가 될 때 까지 B 로 채워 넣습니다.
'ABC'.padEnd(5, '.') // "ABC.."
'ABC'.padEnd(10); // "ABC "
'ABC'.padEnd(5, 'EUNSOL') // "ABCEU"
'ABC'.padEnd(10, 'EUNSOL') // "ABCEUNSOLE"
해당 문자열의 길이가 목표 문자열의 길이보다 길거나 같으면 문자열을 그대로 반환합니다.
'ABC'.padEnd(3, 'K'); // ABC
이를 활용해서 5번의 정규식를 아래와 같이 변경할 수 있습니다.
.padEnd(1, 'a')
문자열의 길이가 1보다 길다면 목표문자열 길이보다 길기때문에 그대로 반환되고 1보다 작을 경우 즉, 문자열이 없을 때 a
로 채워넣게 됩니다.
padEnd
를 활용해서 7번도 해결가능합니다.
str.padEnd(3, str.charAt(str.length -1));
댓글