我正在尝试编写一个函数来去除 Clojure 中的所有 ASCII 元音。我是 Clojure 的新手,我在使用字符串时遇到了一些麻烦。例如,字符串"hello world"
将返回"hll wrld"
. 感谢您的帮助!
2 回答
为此,您可以利用字符串类的底层函数。
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"
比尔大部分是对的,但我认为错误足以保证这个答案。
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 ..)
.