2010-03-31 27 views
6

kelimelerin listesini kaldırmak için nasıl (Clojure içinde) yapmak istiyorsunuz Ne: Örneğindizeleri

, ben kaldırılması gerekir kelimelerin vektör var:

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

.. . ve dizeleri bir vektör:

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

Yani, her yasak kelime her dize kaldırılması gerektiğini ve sonuç, bu durumda, olacaktır: [ "film listesi" "thisisastring" "haha"].

Bu nasıl yapmalı? yerine

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

daha 'deyimsel' olmak isterseniz, clojure.contrib.string gelen replace-str kullanabilirsiniz: function kompozisyonunu ve bu güzel ve basit olabilir -> makro kullanma

+0

Will bu bağlantıyı size yardımcı: http://github.com/richhickey/clojure-contrib/blob/bacf49256673242bb7ce09b9f5983c27163e5bfc/src/main/clojure/clojure/contrib/string.clj#L162 –

cevap

7
(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)) 
+0

Bunu daha iyi seviyorum çünkü yalnızca giriş dizgisinin tek bir geçişi var. –

+0

Aşağıdaki yorumunuzla ilgili olarak, ["th:) e"] ile kendi yanıtınızı denediniz mi? Denediğimde doğru çalışmıyor. –

+0

@ALevy Bana göre, beklendiği gibi çalışıyor: ["th:) e" ": the)"] için çıktılar ("the" ":)") sadece giriş dizesinde görünen yasak sözcükleri kaldırıyor - ve yasak kelimeleri kaldırmış olduğunuzda görünen yasak kelimeler değil. Benim çözümüm, dönüş değerleri yasak kelime vektörlerinin sırasına bağlı olmayan tek kişidir. – cgrand

1
(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

1 beri bu çalışıyor. kanama kenarında ile bu test etmek istediğiniz olanlar için, clojure.contrib.str-utils' akım kaynaklarında clojure.contrib.string' 'yeniden adlandırıldı ve' yeniden gsub' 'haline gelmiştir' unutmayın replace-re'. Ayrıca, bir kelimeyi diğer iki kelimeden ayırmak, onu çevreleyen boşluklardan tam olarak çıkarılmayı gerektiriyorsa (yukarıdaki kodda olduğu gibi hiçbiri yok) * ve * sözcüklerin dizenin başında ve sonunda doğru olarak işleneceğini unutmayın. Daha sonra biraz daha fazla regex büyüsü çağrılırdı. –

+0

"Desen/derleme" çağrınız "re-pattern" ile değiştirilebilir. –

+0

@Brian: "re-pattern" burada gerekli olan "Pattern/LITERAL" argümanını kabul etmiyor. –

0

#(.replace %1 s "").

burada regexs kullanmak gerek yok.

+1

Tüm pasolu cevaplar doğal olarak kırılır: (def yasak-kelimeler [ ":)" "" "". ","]) ([s [": the)"]] için (-> s ((uygulamal ([s yasak sözcükler için] # (.% 1 s yerine "")))))))))) ; Bu döndürür ("") – cgrand