2013-03-08 105 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