Что я хотел бы сделать (в Clojure):
Например, у меня есть вектор слов, которые должны быть удалены:
(def forbidden-words [":)" "the" "." "," " " ...many more...])
... и вектор строк:
(def strings ["the movie list" "this.is.a.string" "haha :)" ...many more...])
Так, каждое запрещенное слово должно быть удалено из каждой строки, и результат, в этом случае, был бы: ["список видео" "thisisastring" "ха-ха"].
Как сделать это?
(def forbidden-words [":)" "the" "." ","])
(def strings ["the movie list" "this.is.a.string" "haha :)"])
(let [pattern (->> forbidden-words (map #(java.util.regex.Pattern/quote %))
(interpose \|) (apply str))]
(map #(.replaceAll % pattern "") strings))
(use 'clojure.contrib.str-utils)
(import 'java.util.regex.Pattern)
(def forbidden-words [":)" "the" "." "," " "])
(def strings ["the movie list" "this.is.a.string" "haha :)"])
(def regexes (map #(Pattern/compile % Pattern/LITERAL) forbidden-words))
(for [s strings] (reduce #(re-gsub %2 "" %1) s regexes))
Используя композицию функций и макрос ->
, это может быть приятно и просто:
(for [s strings]
(-> s ((apply comp
(for [s forbidden-words] #(.replace %1 s ""))))))
Если вы хотите быть более «идиоматичным», вы можете использовать replace-str
из clojure.contrib.string вместо # (. замените% 1 s "")
.
Здесь нет необходимости использовать регулярные выражения.