본문 바로가기
Programming/NodeJS

정규식을 활용한 문자열 다루기

by jerry_kang 2022. 7. 15.
자바스크립트 문자열 다루기

js에서 문자열 다루기

이번에 풀어본 문제의 조건은 다음과 같습니다.

  1. new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
  2. new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
  3. new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
  4. new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
  5. new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
  6. new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
    만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
  7. 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));

댓글