문자열에서 어떤 문자가 몇개나 있는지 개수를 세는 방법에 대해서 알아보겠습니다.

1. split()을 이용한 방법

split(str)은 문자열을 str을 기준으로 분리하며, 분리된 문자열을 배열에 담아 리턴합니다.

아래와 같이 split()을 사용하여 특정 문자열로 분리하면, 리턴된 배열의 길이는 특정 문자열의 개수보다 1개가 많습니다. 이것을 이용하여 개수를 구할 수 있습니다.

  • str.split(substring).length - 1 : str에 substring의 개수
let str = "Hello, World! Hello, Javascript!";
let substring = "Hello";

let count = str.split(substring).length - 1;

console.log(`"${substring}"의 개수: ${count}`);
console.log(str.split(substring));

Output:

"Hello"의 개수: 2
[ '', ', World! ', ', Javascript!' ]

2. 정규표현식을 이용한 방법

str.match(pattern)은 문자열 str에 pattern에 해당하는 문자열이 있으면 찾은 결과를 배열로 리턴합니다.

아래 예제에서

  • 패턴은 /Hello/g이며, Hello라는 문자열을 찾고, g는 정규식의 flags이며 일치하는 모든 값을 찾으라는 의미
  • str.match("/Hello/g")는 str에서 모든 Hello 문자열을 찾음
  • matches를 출력해보면, Hello가 들어있는 배열이 리턴 됨(찾은 값이 모두 Hello 라서)
let str = "Hello, World! Hello, Javascript!";
let substring = /Hello/g;

let matches = str.match(substring);

if (matches) {
  let count = matches.length;
  console.log(`"${substring}"의 개수: ${count}`);
} else {
  console.log(`"${substring}"을(를) 찾을 수 없습니다.`);
}
console.log(matches)

Output:

"/Hello/g"의 개수: 2
[ 'Hello', 'Hello' ]

3. 반복문을 이용한 방법

while문과 indexOf()로 특정 문자의 개수를 셀 수 있습니다.

a.indexOf(b)는 문자열 a에 b가 포함되어있을 때, b 문자열의 시작 Index를 리턴합니다.

  • a.indexOf(b, index)는 a 문자열의 index 부터 b 문자열을 찾음

이것을 이용하여, 아래와 같이 indexOf()가 -1을 리턴할 때까지 특정 문자열을 찾고 개수를 셉니다. 마지막으로 찾은 문자열의 index보다 1개 앞에서 다시 탐색을 하면서 동일한 문자열을 세지 않도록 합니다. 그리고, -1을 리턴하면 더 이상 찾을 문자가 없다는 의미이기 때문에 while문을 종료하면 됩니다.

let str = "Hello, World! Hello, Javascript!";
let substring = "Hello";

let count = 0;
let index = str.indexOf(substring);

while (index !== -1) {
  count++;
  index = str.indexOf(substring, index + 1);
}
console.log(`"${substring}"의 개수: ${count}`);

Output:

"Hello"의 개수: 2