Java/clojure: разделитель из нескольких символов и его разделитель
Я работаю над проектом в clojure, который может взаимодействовать с любыми java-классами, поэтому ответ на мой вопрос может быть для java или clojure.
По сути, мне нужно иметь возможность разбивать строку на компоненты на основе заданного разделителя (который будет содержать более одного символа), но в то же время сохранять разделители.
Например:
splitting "test:test:test" on ":" => [ "test" ":" "test" ":" "test" ]
splitting "::test::test::" on "::" => [ "::" "test" "::" "test" "::" ]
Шкафы, в которые я пришел, используют Clojure clojure.string/split
, но на самом деле он не возвращает разделители. Вторым наиболее близким было использование StringTokenizer, который возвращает разделители, но не принимает многосимвольные разделители.
Кто-нибудь знает какие-либо решения, кроме простого разбивания строки на последовательность символов и выполнения странного сокращения?
2 ответа
Вот версия, которая создает регулярное выражение для соответствия пробелам до и после разделителей вместо самой строки разделителя (при условии, что в регулярных выражениях нет специальных символов в 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" "::"]
(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")