2013-03-08 103 views
7

我正在處理clojure中的一個項目,它可以與任何java類互操作,所以我的問題的答案可以是java或clojure。Java/clojure:多字符分隔符,並保留分隔符

基本上我需要能夠將一個字符串拆分爲基於給定分隔符(這將超過一個字符),但同時保留分隔符。

例如:

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

我一直在使用Clojure的clojure.string/split來使用的廁所,但它實際上並沒有返回的分隔符。第二個最接近的是使用StringTokenizer,它返回分隔符但不接受多字符分隔符。

有誰知道任何解決方案,然後只是把字符串分解成一個字符序列並運行一個奇怪的減少它?

回答

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

感謝您的幫助,但對於第二種情況,我最後需要第三個分隔符。 – 2013-03-08 17:15:52