15

文字列内の正規表現の一致数を取得するための最速のルーチン (インタラクティブではない) を探しています。

何かのようなもの

(count-occurrences "a" "alabama")
=> 4
4

7 に答える 7

27

count-matchesインタラクティブに行います。探し始めるには良い場所かもしれません。

于 2012-08-07T14:34:31.890 に答える
14

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))
于 2012-08-07T14:37:49.357 に答える
8

これは、再帰とアキュムレータを使用したより機能的な答えです。追加の利点として、それは使用しません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))
于 2012-08-07T15:01:18.623 に答える
3

パッケージsには、関数 がありますs-count-matches

于 2016-12-07T12:40:08.360 に答える
0

私はおそらくこれを行うでしょう:

(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))
于 2021-12-08T21:09:19.260 に答える