4

我正在尝试编写一个函数来去除 Clojure 中的所有 ASCII 元音。我是 Clojure 的新手,我在使用字符串时遇到了一些麻烦。例如,字符串"hello world"将返回"hll wrld". 感谢您的帮助!

4

2 回答 2

15

为此,您可以利用字符串类的底层函数。

user=> (.replaceAll "hello world" "[aeiou]" "")           
"hll wrld"

如果这感觉像是作弊,你可以把字符串变成一个序列,然后用一个集合的补集过滤它,然后再把它变成一个字符串。

user=> (apply str (filter (complement #{\a \e \i \o \u}) (seq "hello world")))
"hll wrld"

clojure 中的集合也是函数。complement接受一个函数并返回一个函数,该函数返回原始函数的逻辑非。相当于这个。apply接受一个函数和一堆参数,并使用这些参数调用该函数(粗略地说)。

user=> (apply str (filter #(not (#{\a \e \i \o \u} %)) (seq "hello world")))
"hll wrld"

编辑

多一个...

user=> (apply str (re-seq #"[^aeiou]" "hello world"))
"hll wrld"

#"[^aeiou]"是一个正则表达式,并且 re-seq 将匹配项转换为一个 seq。它类似于clojure,并且似乎表现良好。在使用 Java 之前,我可能会尝试这个。seq 字符串的速度要慢一些。

重要编辑

还有一种方法,那就是使用clojure.string/replace. 这可能是最好的方式,因为它应该在 Clojure 或 Clojurescript 中工作。

例如

dev:cljs.user=> (require '[clojure.string :as str])
nil

dev:cljs.user=> (str/replace "hello world" #"[aeiou]" "")
"hll wrld"
于 2012-10-24T03:51:46.163 回答
8

比尔大部分是对的,但我认为错误足以保证这个答案。

user=> (.replaceAll "hello world" "[aeiou]" "")           
"hll wrld"

这个解决方案是完全可以接受的。事实上,这是提出的最佳解决方案。如果解决方案是最干净和最快的,那么下降到 Java 没有任何问题。

正如他所说,另一个解决方案是使用序列函数。但是,他的代码有点奇怪。切勿filter(not ..)or一起使用complement。有一个专门用于此的功能remove

user> (apply str (remove #{\a \e \i \o \u} "hello world"))
"hll wrld"

您也不必调用seq字符串。Clojure 的所有 seq 函数都会为您处理。

他的最后一个解决方案很有趣,但我更喜欢第一个,因为它不涉及(apply str ..).

于 2012-10-24T10:44:38.210 回答