文字列内の正規表現の一致数を取得するための最速のルーチン (インタラクティブではない) を探しています。
何かのようなもの
(count-occurrences "a" "alabama")
=> 4
count-matches
インタラクティブに行います。探し始めるには良い場所かもしれません。
how-many
(aliased count-matches
) はこれを行いますが、バッファーで機能します。
文字列で動作するものは次のとおりです。
(defun how-many-str (regexp str)
(loop with start = 0
for count from 0
while (string-match regexp str start)
do (setq start (match-end 0))
finally return count))
これは、再帰とアキュムレータを使用したより機能的な答えです。追加の利点として、それは使用しませんcl
:
(defun count-occurences (regex string)
(recursive-count regex string 0))
(defun recursive-count (regex string start)
(if (string-match regex string start)
(+ 1 (recursive-count regex string (match-end 0)))
0))
パッケージsには、関数 がありますs-count-matches
。
私はおそらくこれを行うでしょう:
(defun count-occurrences (regexp string)
"Return the number of occurrences of REGEXP in STRING."
(let ((count 0))
(with-temp-buffer
(save-excursion (insert string))
(while (re-search-forward regexp nil t)
(cl-incf count)))
count))