Как удалить список слов из строк - PullRequest
6 голосов
/ 31 марта 2010

Что я хотел бы сделать (в Clojure):

Например, у меня есть вектор слов, которые нужно удалить:

(def forbidden-words [":)" "the" "." "," " " ...many more...])

... и вектор строк:

(def strings ["the movie list" "this.is.a.string" "haha :)" ...many more...])

Таким образом, каждое запрещенное слово должно быть удалено из каждой строки, и в этом случае результат будет: ["список фильмов" "thisisastring" "ха-ха"].

Как это сделать?

Ответы [ 3 ]

7 голосов
/ 01 апреля 2010
(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))
1 голос
/ 31 марта 2010
(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))
0 голосов
/ 01 апреля 2010

Используя композицию функций и макрос ->, это может быть просто и красиво:

(for [s strings] 
  (-> s ((apply comp 
           (for [s forbidden-words] #(.replace %1 s ""))))))

Если вы хотите быть более «идиоматичным», вы можете использовать replace-str из clojure.contrib.string вместо #(.replace %1 s "").

Здесь нет необходимости использовать регулярные выражения.

...