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

Спасибо за помощь , но для второго случая мне нужен этот третий разделитель в самом конце. –

Смежные вопросы