2013-03-08 6 views
7

Je travaille sur un projet en clojure, qui peut interopérer avec toutes les classes java, donc la réponse à ma question pourrait être java ou clojure.Java/clojure: délimiteur de plusieurs caractères, et garde le délimiteur

Fondamentalement, je dois être capable de diviser une chaîne en composants en fonction d'un délimiteur donné (qui sera plus d'un caractère) mais en même temps garder les délimiteurs.

Par exemple:

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

Les placards que je suis venu à l'aide clojure.string/split l'utilisation de Clojure, mais il ne retourne pas vraiment les délimiteurs. Le deuxième plus proche utilisait StringTokenizer, qui renvoie les délimiteurs mais n'accepte pas les délimiteurs multi-caractères.

Est-ce que quelqu'un connaît des solutions autres que la rupture de la chaîne dans une séquence de caractères et d'exécuter une réduction étrange sur elle?

Répondre

8

est ici une version qui construit une regex pour faire correspondre les lacunes avant et après les délimiteurs, au lieu de la chaîne de delimiter lui-même (en supposant caractères spéciaux regex dans 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

Merci pour l'aide , mais pour le second cas j'ai besoin de ce troisième délimiteur à la toute fin. –