Skip to main content

How to Count the Number of Regex Matches in a String in JavaScript

A common task in text processing and data validation is to count how many times a specific pattern appears in a string. For example, you might need to count the number of vowels, digits, or occurrences of a specific word. The most direct and idiomatic way to do this in JavaScript is with the String.prototype.match() method combined with a regular expression.

This guide will teach you how to use match() with the global flag to get all occurrences of a pattern and how to safely count them. We will also cover an alternative looping method using RegExp.prototype.exec().

The string.match() method is the best tool for this job. When used with a regular expression that has the global (g) flag, it returns an array of all matches. You can then simply get the length of that array.

For example, you have a string and need to count every occurrence of the word "apple". How to count the number of times "apple" appears?

// Problem: How to count the number of times "apple" appears?
const text = 'An apple a day keeps the doctor away. I love apple pie.';

This clean, one-line solution is the best practice.

const text = 'An apple a day keeps the doctor away. I love apple pie.';
const pattern = /apple/gi; // g = global, i = case-insensitive

// The `|| []` is a safety net in case no matches are found.
const matches = text.match(pattern) || [];
const count = matches.length;

console.log(`The word "apple" appears ${count} times.`);

Output:

The word "apple" appears 2 times.

How the match() Method Works​

  • The Regex and the Global Flag (g): The most critical part of this technique is the g flag on the regular expression. Without it, match() will only find the first occurrence. The i flag for case-insensitivity is also commonly used.
  • The Return Value:
    • If one or more matches are found, match() returns an array containing all the matching substrings (e.g., ['apple', 'apple']).
    • If no matches are found, match() returns null.
  • The Safety Net (|| []): Because match() can return null, trying to access .length on null would throw a TypeError. The || [] (OR empty array) is a standard idiom that provides a safe fallback. If text.match(pattern) returns null, the expression becomes null || [], which evaluates to []. Getting the .length of an empty array is 0, which is the correct count.

The Looping Alternative: RegExp.prototype.exec()​

An alternative method, which is more manual but can be useful in some complex scenarios, is to use the exec() method in a while loop. The exec() method finds the next match in a string each time it's called.

const text = 'An apple a day keeps the doctor away. I love apple pie.';
const pattern = /apple/gi;
let count = 0;
let match;

// The loop continues as long as exec() keeps finding matches.
while ((match = pattern.exec(text)) !== null) {
count++;
}

console.log(`The word "apple" appears ${count} times.`);

Output:

The word "apple" appears 2 times.
note

While this works perfectly, the .match().length approach is generally preferred for its conciseness and declarative style when you only need the final count.

Practical Examples with Common Regular Expressions​

This technique is incredibly versatile. Here are a few examples of counting different patterns.

How to Count Digits​

const str = 'User ID: 123, Item ID: 456';
const digitCount = (str.match(/[0-9]/g) || []).length;

console.log(`The string contains ${digitCount} digits.`);

Output:

The string contains 6 digits.

How to Count Vowels​

const sentence = 'A quick brown fox';
const vowelCount = (sentence.match(/[aeiou]/gi) || []).length;

console.log(`The sentence contains ${vowelCount} vowels.`);

Output:

The sentence contains 5 vowels.

How to Count Words​

const phrase = 'One two three.';
// `\b` is a word boundary, `\w+` is one or more word characters.
const wordCount = (phrase.match(/\b\w+\b/g) || []).length;

console.log(`The phrase contains ${wordCount} words.`);

Output:

The phrase contains 3 words.

Conclusion​

For counting the number of regex matches in a string, modern JavaScript provides a clean and powerful solution.

  • The .match(/pattern/g).length method is the recommended best practice. It is declarative, concise, and highly readable.
  • Always include the global (g) flag on your regular expression to ensure you find all occurrences, not just the first.
  • Always use the || [] fallback to prevent a TypeError in cases where no matches are found.
  • The exec() method in a while loop is a functional alternative but is more verbose and generally unnecessary if you only need the total count.