7

私は任意の Java クラスと相互運用できる clojure のプロジェクトに取り組んでいるので、私の質問への答えは Java または clojure のいずれかになります。

基本的に、特定の区切り文字 (複数の文字) に基づいて文字列をコンポーネントに分割できる必要がありますが、同時に区切り文字を保持する必要があります。

例えば:

splitting "test:test:test" on ":"  => [ "test" ":" "test" ":" "test" ]
splitting "::test::test::" on "::" => [ "::" "test" "::" "test" "::" ]

clojure の を使用して使用するようになったクローゼットですがclojure.string/split、実際には区切り文字が返されません。2 番目に近いのは、区切り文字を返しますが、複数文字の区切り文字を受け入れない StringTokenizer を使用することでした。

文字列を一連の文字に分割して奇妙なreduceを実行する以外の解決策を知っている人はいますか?

4

2 に答える 2

8

区切り文字列自体の代わりに、区切り文字の前後のギャップに一致するように正規表現を構築するバージョンを次に示します ( に正規表現の特殊文字がないことを前提としていますd)。

=> (defn split-with-delim [s d]
     (clojure.string/split s (re-pattern (str "(?=" d ")|(?<=" d ")"))))
#'user/split-with-delim
=> (split-with-delim "test:test:test" ":")
["test" ":" "test" ":" "test"]
=> (split-with-delim "::test::test::" "::")
["" "::" "test" "::" "test" "::"]
于 2013-03-08T10:09:28.543 に答える
4
(defn split-it [s d]
  (interpose d (str/split s (re-pattern d))))

(split-it "test:test:test" ":")
=> ("test" ":" "test" ":" "test")

(split-it "::test::test::" "::")
=> ("" "::" "test" "::" "test")
于 2013-03-08T04:41:14.000 に答える