Emacs regexp计数发生

yPh*_*hil 11 regex emacs

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

就像是

(count-occurrences "a" "alabama")
=> 4
Run Code Online (Sandbox Code Playgroud)

Nic*_*out 24

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


eve*_*_jr 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))
Run Code Online (Sandbox Code Playgroud)


Nic*_*out 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))
Run Code Online (Sandbox Code Playgroud)

  • 并不是的.Emacs-lisp不适合递归解决方案.我倾向于认为Emacs-lisp是具有一流功能的程序,而不是真正的功能. (3认同)
  • 这可能看起来更优雅,但没有尾调用优化,递归解决方案受堆栈大小的约束.由于堆栈维护,它也会变慢. (2认同)