Emacs regexp计数发生

时间:2012-08-07 13:54:00

标签: regex emacs

我正在寻找最快的例程(不是交互式)来获取字符串中正则表达式的匹配数。

这样的东西
(count-occurrences "a" "alabama")
=> 4

5 个答案:

答案 0 :(得分:21)

count-matches以交互方式进行。也许是一个开始寻找的好地方。

答案 1 :(得分:11)

how-many(别名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))

答案 2 :(得分:6)

这是一个使用递归和累加器的更实用的答案。另外一个好处是,它不使用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))

答案 3 :(得分:1)

在包s中,有一个函数s-count-matches

答案 4 :(得分:0)

如果您在创建变量副本时没有任何问题,可以尝试

(- (length (split-string "Hello World" "o")) 1)
(- (length (split-string "aaabaaa" "a")) 1)
(- (length (split-string "This
string
has three
newlines" "
")) 1)
2
6
3

如果加载 cl-lib 包没有任何问题,那么您可以尝试

(require 'cl-lib)

(cl-count ?o "Hello World")
(cl-count ?a "aaabaaa")
(cl-count ?
 "This
string
has three
newlines")
2
6
3