2013-03-08 18 views
7

私はjavaクラスとの相互運用が可能なclojureのプロジェクトで作業していますので、私の質問に対する答えはjavaまたはclojureのいずれかになります。Java/clojure:複数の文字区切り文字で区切り文字を保持

基本的には、指定した区切り文字(1文字以上)に基づいて文字列を分割することができる必要がありますが、同時に区切り文字も保持する必要があります。

例えば:

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

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

他の解決方法を知っている人はいますか?文字列を文字列に分割し、それを奇妙なものにするだけですか?助けのための

=> (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" "::"] 

答えて

8

は前と区切り文字の後のギャップにマッチする正規表現を構築したバージョンの代わりに、( dには正規表現の特殊文字を想定していない)区切り文字列そのものです2番目のケースでは、最後に3番目の区切り文字が必要です。
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") 
+0

ありがとう:ここ –

関連する問題