Clojure - 如何计算字符串中的特定单词

kfk*_*off 0 words clojure count

(def string "this is an example string. forever and always and and")
Run Code Online (Sandbox Code Playgroud)

有人能帮助我吗?我在Clojure编码,我一直试图计算字符串中'和'这个词的出现次数.

任何帮助深表感谢

Leo*_*tny 6

一种方法是使用正则表达式和re-seq函数.这是一个"天真"的例子:

(count (re-seq #"and" string))
Run Code Online (Sandbox Code Playgroud)

这里是相同的代码,用treading宏->>编写:

(->> string
     (re-seq #"and")
     count)
Run Code Online (Sandbox Code Playgroud)

它会计算"and"你的子串的所有外观string.这意味着像p a 这样的单词也会计算在内.但是我们只能and通过在正则表达式中添加一些限制来计算单词(使用"单词边界"元字符\b):

(->> string
     (re-seq #"\band\b")
     count)
Run Code Online (Sandbox Code Playgroud)

此版本将确保"and"子字符串由非字母字符包围.

如果你想要不区分大小写的搜索(包括"And"):

(->> string
     (re-seq #"(?i)\band\b")
     count)
Run Code Online (Sandbox Code Playgroud)

替代解决方案是使用命名空间中的split函数clojure.string:

(require '[clojure.string :as s])

(->> (s/split string #"\W+") ; split string on non-letter characters
     (map s/lower-case) ; for case-insensitive search
     (filter (partial = "and"))
     count)
Run Code Online (Sandbox Code Playgroud)

  • 我认为更简单的是`\ band\b`. (3认同)