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\ 를 사용하게되면
Hellominsu, eunsol Hello
위와 같이 첫번째 Hello 만 잡힙니다.
\Hello$\ 를 사용하게 되면
Hello minsu, eunsolHello
위와 같이 마지막에 있는 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));
댓글