删除第一个数组中与第二个数组中的元素匹配的所有子字符串

Remove all substrings in first-array that match elements in second-array

任务

second-array 中匹配的每个字符串删除 first-array 中的每个子字符串。

在 Clojure 中最好的实现方式是什么?

Example:

first-array: ["Adam" "Goolan" "silly"]

second-array: [ "a" "oo" "ll"]

result: ["Adm" "Gln" "siy"]

Note that the result should be the same if

second-array: [ "oo" "ll" "a"]

如果是匹配元素(即first中的第一项匹配second中的第一项,依此类推):

> (defn the-quest [xs ys] 
    (map #(clojure.string/replace (first %1) (second %1) "") (map vector xs ys)))
#'sandbox1427/the-quest
> (the-quest ["Adam" "Goolan" "silly"] ["a" "oo" "ll"])
("Adm" "Glan" "siy")

请参阅下面@Lee 的评论:

> (map #(clojure.string/replace %1 %2 "") ["Adam" "Goolan" "silly"] ["a" "oo" "ll"])
("Adm" "Glan" "siy")
>  

注意 - 以上由 http://www.tryclj.com/

提供

任意匹配:

user=> (defn repl-all [x ys] 
  #_=>    (reduce #(clojure.string/replace %1 %2 "") x ys))

user=> (defn the-quest [xs ys]
  #_=>    (map #(repl-all %1 ys) xs))

user=> (the-quest ["Adam" "Goolan" "silly"] ["a" "oo" "ll"])
("Adm" "Gln" "siy")

这个问题有两种略有不同的表述方式,您的示例并未完全表明您想要哪种表述方式:

  1. 通过一次,删除输入字符串中与任何第二个字符串匹配的任何子字符串。
  2. 对每个要依次删除的字符串进行一次处理。这可以删除比选项 1 更多的字符,因为每次删除都可以创建新的子字符串,否则这些子字符串将不合格。

如果你想要的是第二种情况,那似乎已经解决了。如果是第一种情况,我会建议

(import java.util.regex.Pattern)

(defn the-quest [strs to-remove]
  (let[my-pattern (->> to-remove
                       (map #(Pattern/quote %))
                       (clojure.string/join "|")
                       re-pattern)]
    (map #(clojure.string/replace % my-pattern "") strs)))

这里我只是创建了一个匹配任何 to-remove 字符串的正则表达式,并在正则表达式的实例上执行一个 replace。如果您希望能够在要删除的内容中使用正则表达式控制字符,则必须引入 Pattern/quote