Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String clojure:从句子中删除一组字符串_String_Replace_Clojure - Fatal编程技术网

String clojure:从句子中删除一组字符串

String clojure:从句子中删除一组字符串,string,replace,clojure,String,Replace,Clojure,我有一个句子“中国北京上海美国澳大利亚”,还有一组单词#{“美国”“澳大利亚”} 现在我正在编写一个函数,该函数将输入作为句子和单词集,并从句子中删除它们: (defn remove-words-from-sentence [sentence words] (for [w words] (-> sentence (.replaceAll w ""))) 注:我希望替换确切的单词出处。。所以,若单词包含字母“a”,那个么句子中的所有a都不应该被

我有一个句子“中国北京上海美国澳大利亚”,还有一组单词#{“美国”“澳大利亚”}

现在我正在编写一个函数,该函数将输入作为句子和单词集,并从句子中删除它们:

(defn remove-words-from-sentence [sentence words]
  (for [w words] (-> sentence
                     (.replaceAll w "")))
注:我希望替换确切的单词出处。。所以,若单词包含字母“a”,那个么句子中的所有a都不应该被替换,只应该替换单词a


但是上面的功能不起作用,有什么帮助吗

for
迭代给定的序列,生成另一个序列。因此,您将生成一个列表,其中的元素分别表示每个替换项,而不是组合

您需要的是首先替换第一个单词,然后根据替换结果删除第二个单词,依此类推。这是
reduce
的典型情况:

(defn remove-words-from-sentence
  [sentence words]
  (reduce #(.replace % %2 "") sentence words))
(请注意,
replace
replaceAll
的操作相同,但使用文字替换,不允许使用正则表达式。)

编辑:这只是修复OP试图执行的操作。如果其中一个词是“eij”(因为它将删除“北京”的这一部分),则可能会产生不必要的结果。解决此问题的一种方法是使用
(.replaceAll%(str“\\b\\Q”%2“\\E\\b\\s*”)
进行替换;然后
trim
结果。因此,更可靠的版本可能如下所示:

(require '[clojure.string :as string])
(defn remove-words-from-sentence
  [sentence words]
  (let [pattern (->> (for [w words] (str "\\b\\Q" w "\\E\\b"))
                     (string/join "|")
                     (format "(%s)\\s*"))]
    (.trim (.replaceAll sentence pattern ""))))

但这一切都取决于OP想要什么。

一种方法是将句子分割成单独的单词,将要删除的单词集中,然后从句子中过滤掉这些单词

(let [sentence (clojure.string/split (read-line) #" ")
      words (set (clojure.string/split (read-line) #" "))]
  (clojure.string/join " "
                       (filter (complement words)
                               sentence)))



user=> china beijing shanghai USA australia ;;input sentence
user=> china USA ;;input words
user=> "beijing shanghai australia" ;;output
编辑:

提请我注意,
(filter(complement pred)coll)
相当于
(remove pred coll)
。您可以通过查看
remove

(source remove)
(defn remove
  "Returns a lazy sequence of the items in coll for which
  (pred item) returns false. pred must be free of side-effects."
  {:added "1.0"
   :static true}
  [pred coll]
  (filter (complement pred) coll))
nil
因此,可以使用
删除

(let [sentence (clojure.string/split (read-line) #" ")
      words (set (clojure.string/split (read-line) #" "))]
  (clojure.string/join " " (remove words sentence)))

这样更容易阅读。您可以将其理解为“从句子中删除单词”。

到目前为止,答案不涉及指定输入类型(字符串和集合)的问题

因为输入的单词在问题中被指定为一个集合,而句子是一个字符串——最简单的解决方案可能是使用集合——也很容易理解

(defn remove-words-from-sentence [sentence words]
    (str/join " "(set/difference (into #{} (str/split sentence #" ")) words))
)
广告宣传的作品:

(remove-words-from-sentence "china beijing shanghai USA australia" #{"USA" "australia"}) 
"beijing china shanghai"

Set将更改顺序??否。虽然Set确实不保留顺序,但在这里没有任何效果,因为要删除的单词是Set,而不是句子。因此,句子中单词的顺序是不变的,只有被删除的单词在一个集合中,以便快速查找。集合不会改变字符串的顺序吗?是的。您可以使用orderedset进行操作。(平地。有序。集合)
(remove-words-from-sentence "china beijing shanghai USA australia" #{"USA" "australia"}) 
"beijing china shanghai"