Clojure-编写“先拆分,后拆分”的惯用方法
编写以下函数的惯用方法是什么Clojure-编写“先拆分,后拆分”的惯用方法,clojure,split,Clojure,Split,编写以下函数的惯用方法是什么 (split-first #"." "abc.def.ghi") ;;=>["abc", "def.ghi"] (split-last #"." "abc.def.ghi") ;;=>["abc.def", "ghi"] 使用split有一个明显的(丑陋的?)解决方案,但我确信还有更优雅的解决方案?可能先使用regexes/indexOf/split和?进行拆分,最好的方法是: (defn split-first [re s] (clojure.s
(split-first #"." "abc.def.ghi") ;;=>["abc", "def.ghi"]
(split-last #"." "abc.def.ghi") ;;=>["abc.def", "ghi"]
使用
split
有一个明显的(丑陋的?)解决方案,但我确信还有更优雅的解决方案?可能先使用regexes/indexOf/split和?进行拆分,最好的方法是:
(defn split-first [re s]
(clojure.string/split s re 2))
(split-first #"\." "abc.def.ghi")
=> ["abc" "def.ghi"]
(split-first #"<>" "abc<>def<>ghi")
=> ["abc" "def<>ghi"]
(定义先拆分[re s]
(clojure.string/split s re 2))
(先拆分“abc.def.ghi”)
=>[“abc”“def.ghi”]
(先拆分“abcdefghi”)
=>[“abc”“defghi”]
“最后分割”的一种方法是使用否定的前瞻断言:
(defn split-last [re s]
(let [pattern (re-pattern (str re "(?!.*" re ")"))]
(split-first pattern s)))
(split-last #"\." "abc.def.ghi")
=> ["abc.def" "ghi"]
(split-last #"<>" "abc<>def<>ghi")
=> ["abc<>def" "ghi"]
(定义最后拆分[re s]
(让[pattern(re pattern)(str re“(?!!*“re”))))
(先分割模式(s)))
(最后拆分为“abc.def.ghi”)
=>[“abc.def”“ghi”]
(最后拆分为“abcdefghi”)
=>[“abcdef”“ghi”]
如果您不一定需要与regexp匹配,则可以:
(defn index-of
[^String s c]
(.indexOf s c))
(defn last-index-of
[^String s c]
(.lastIndexOf s c))
(defn split-at-index-fn
[f c s]
(let [i (f s c)]
; I do not know what you want returned if no match is found
(when-not (neg? i)
[(.substring s 0 i) (.substring s (inc i))])))
(def split-first
(partial split-at-index-fn index-of))
(def split-last
(partial split-at-index-fn last-index-of))
这不是很惯用,因为它主要是Java互操作。首先拆分就是
(clojure.string/split“abc.def.ghi”#“\.”2)
@cfrick这非常优雅。如果你有同样好的split last
的东西,我很乐意接受你的回答。好主意,但你也必须reverse
regexp。现在,您的解决方案将只适用于回文模式。感谢您的反馈-我切换到了使用负前瞻断言的解决方案。您可以节省一些字符,如果您不喜欢interop的外观,请使用subs
而不是。substring
,但如果找不到匹配项,它将返回一个空向量(我认为这是最合乎逻辑的做法,可以随意不同意)@nha,好吧,通过将when not
更改为if not
,并在else块中返回一个空向量,这很容易实现。@ponzao是的。但如果可能的话,我希望它与正则表达式一起工作?那么不幸的是,这个实现不符合您的要求,@toolkit的解决方案应该是这样的。