删除第一个数组中与第二个数组中的元素匹配的所有子字符串
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 更多的字符,因为每次删除都可以创建新的子字符串,否则这些子字符串将不合格。
如果你想要的是第二种情况,那似乎已经解决了。如果是第一种情况,我会建议
(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
。
任务
为 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 更多的字符,因为每次删除都可以创建新的子字符串,否则这些子字符串将不合格。
如果你想要的是第二种情况,那似乎已经解决了。如果是第一种情况,我会建议
(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
。