Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript 문자열 앞뒤의 물음표(?) 제거하기

이번 글에서는 문자열을 유일한 인수로 받아 처리하는 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?'));

두 방식 모두 문자열 중간에 위치한 물음표는 그대로 보존하면서, 앞뒤에 붙어 있는 물음표만 정확히 제거한다는 점을 기억하세요.