이번 글에서는 문자열을 유일한 인수로 받아 처리하는 JavaScript 함수를 작성해 보겠습니다. 이 문자열은 시작 부분과 끝 부분에 물음표(?)가 포함되어 있을 수 있으며, 함수는 문자열의 맨 앞과 맨 뒤에 있는 모든 물음표를 제거하되 나머지 내용은 그대로 유지해야 합니다.
예시 −
입력 문자열이 다음과 같다면 −
const str = '??this is a ? string?';
기대하는 출력 결과는 다음과 같습니다 −
const output = 'this is a ? string';
예제 코드
다음은 이 문제를 해결하는 전체 코드입니다 −
const str = '??this is a ? string?';
const specialTrim = (str = '', char = '?') => {
str = str.trim();
let countChars = orientation => {
let inner = (orientation == "left")? str :
str.split("").reverse().join("");
let count = 0;
for (let i = 0, len = inner.length; i < len; i++) {
if (inner[i] !== char) {
break;
};
count++;
};
return (orientation == "left")? count : (-count);
};
const condition = typeof char === 'string' && str.indexOf(char) === 0 && str.lastIndexOf(char, -1) === 0;
if (condition) {
str = str.slice(countChars("left"), countChars("right")).trim();
};
return str;
}
console.log(specialTrim(str));실행 결과
위 코드를 실행하면 콘솔에 다음과 같이 출력됩니다 −
this is a ? string
코드 동작 원리
이 함수가 어떻게 동작하는지 단계별로 살펴보겠습니다.
먼저 str.trim()을 호출하여 문자열 양쪽의 불필요한 공백을 제거합니다. 이후 countChars 헬퍼 함수는 왼쪽 또는 오른쪽에서부터 지정한 문자가 연속으로 몇 번 등장하는지 계산합니다. 오른쪽을 검사할 때는 문자열을 뒤집어서 동일한 로직을 재사용하는 것이 핵심 아이디어입니다.
그다음 slice(countChars("left"), countChars("right"))를 통해 앞뒤의 물음표가 존재하는 구간을 잘라내고, 마지막으로 한 번 더 trim()을 호출하여 깔끔한 결과를 반환합니다.
대안: 정규식 활용하기
더 간결하게 구현하고 싶다면 정규식을 사용할 수도 있습니다. 다음과 같이 replace() 메서드와 함께 정규식을 활용하면 훨씬 짧은 코드로 같은 결과를 얻을 수 있습니다.
const regexTrim = (str = '', char = '?') => {
const escaped = char.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
return str.replace(new RegExp(`^[${escaped}]+|[${escaped}]+$`, 'g'), '');
};
console.log(regexTrim('??this is a ? string?'));두 방식 모두 문자열 중간에 위치한 물음표는 그대로 보존하면서, 앞뒤에 붙어 있는 물음표만 정확히 제거한다는 점을 기억하세요.