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

JavaScript로 문자열 안에 특정 문자열이 몇 번 나오는지 세는 방법

JavaScript에서 두 개의 문자열을 받아, 첫 번째 문자열(str1) 안에 두 번째 문자열(str2)이 총 몇 번 등장하는지 세어 그 결과를 반환하는 함수를 작성해야 하는 경우가 종종 있습니다.

예를 들어 다음과 같은 동작을 기대할 수 있습니다.

count('this is a string', 'is') → 2 반환

구현 예제

아래 코드는 indexOf() 메서드를 활용해 문자열 내 특정 부분 문자열의 등장 횟수를 계산하는 함수입니다. 추가로 allowOverlapping 옵션을 통해 겹치는 패턴도 허용할지 여부를 지정할 수 있습니다.

const str1 = 'this is a string';
const str2 = 'is';

const countOccurrences = (str1, str2, allowOverlapping = true) => {
    // 입력값이 문자열이 아니더라도 안전하게 처리하도록 변환
    str1 += "";
    str2 += "";

    // 검색할 문자열이 비어 있다면 가능한 위치 개수만큼 반환
    if (str2.length <= 0) return (str1.length + 1);

    let n = 0;          // 발견된 횟수
    let pos = 0;        // 현재 검색 시작 위치
    const step = allowOverlapping ? 1 : str2.length;

    while (true) {
        pos = str1.indexOf(str2, pos);
        if (pos >= 0) {
            ++n;
            pos += step;
        } else break;
    }
    return n;
};

console.log(countOccurrences(str1, str2));

코드 동작 원리

  • indexOf(str2, pos): pos 위치부터 검색을 시작해 str2가 처음 나타나는 인덱스를 반환합니다. 찾지 못하면 -1을 반환합니다.
  • step 값: 기본적으로 1씩 이동하기 때문에 겹치는 패턴(예: 'aaa'에서 'aa' 찾기)도 모두 계산합니다. allowOverlappingfalse로 설정하면 str2 길이만큼 건너뛰어 겹치지 않는 매칭만 셉니다.
  • 반복 종료 조건: 더 이상 일치하는 문자열을 찾지 못해 indexOf-1을 반환하면 루프가 종료됩니다.

실행 결과

위 코드를 실행하면 콘솔에 다음과 같이 출력됩니다.

2

'this is a string'이라는 문장에는 'is'가 정확히 2번 포함되어 있으므로 결과값으로 2가 출력되는 것을 확인할 수 있습니다.