2013-03-08 6 views
7

Sto lavorando a un progetto in clojure, che può essere utilizzato con qualsiasi classe java, quindi la risposta alla mia domanda potrebbe essere java o clojure.Java/clojure: delimitatore di caratteri multipli e mantenere il delimitatore

Fondamentalmente ho bisogno di essere in grado di dividere una stringa in componenti basati su un dato delimitatore (che sarà più di un carattere) ma allo stesso tempo mantenere i delimitatori.

Ad esempio:

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

Gli armadi sono venuto uso utilizzando clojure di clojure.string/split, ma in realtà non restituisce i delimitatori. Il secondo più vicino utilizzava StringTokenizer, che restituisce i delimitatori ma non accetta i delimitatori a più caratteri.

Qualcuno sa di altre soluzioni, quindi basta spezzare la stringa in una sequenza di caratteri e farne una strana riduzione su di essa?

risposta

8

Ecco una versione che costruisce una regex per abbinare le lacune prima e dopo i delimitatori, invece della stringa delimitatore stesso (supponendo che non caratteri speciali regex in 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

Grazie per l'aiuto ma per il secondo caso ho bisogno di quel terzo delimitatore proprio alla fine. –