1. ホーム
  2. javascript

[解決済み] Javascriptで正規表現にマッチした数を数える

2022-09-28 17:35:58

質問

あるテキストに含まれるスペース、タブ、改行の数をカウントする正規表現を書きたいと思いました。そこで、私は素朴に次のように書きました。

numSpaces : function(text) { 
    return text.match(/\s/).length; 
}

なぜかいつも 1 . 上記の文の問題点は何でしょうか?私はその後、以下のようにして問題を解決しました。

numSpaces : function(text) { 
    return (text.split(/\s/).length -1); 
}

どのように解決するのですか?

tl;dr: Generic Pattern Counter (汎用パターンカウンタ)

// THIS IS WHAT YOU NEED
const count = (str) => {
  const re = /YOUR_PATTERN_HERE/g
  return ((str || '').match(re) || []).length
}

文字列中の正規表現パターンの出現回数を数える一般的な方法を探していて、出現回数がゼロの場合に失敗することを望まない人のために、このコードはあなたが必要とするものです。以下はそのデモです。

/*
 *  Example
 */

const count = (str) => {
  const re = /[a-z]{3}/g
  return ((str || '').match(re) || []).length
}

const str1 = 'abc, def, ghi'
const str2 = 'ABC, DEF, GHI'

console.log(`'${str1}' has ${count(str1)} occurrences of pattern '/[a-z]{3}/g'`)
console.log(`'${str2}' has ${count(str2)} occurrences of pattern '/[a-z]{3}/g'`)

オリジナル回答

最初のコードに問題があるのは グローバル識別子 :

>>> 'hi there how are you'.match(/\s/g).length;
4

がなければ g の部分がないと、最初の出現にのみマッチし、そこで停止します。

また、この正規表現は連続したスペースを2回カウントすることに注意してください。

>>> 'hi  there'.match(/\s/g).length;
2

それが好ましくない場合は、こうすることもできます。

>>> 'hi  there'.match(/\s+/g).length;
1