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的解决方案应该是这样的。