java string clojure split tokenize

Java/clojure: delimitador de caracteres múltiples, y mantener el delimitador



clojure string substring (2)

Aquí hay una versión que construye una expresión regular para que coincida con las brechas antes y después de los delimitadores, en lugar de la cadena de delimitador en sí (suponiendo que no hay caracteres especiales regex en 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" "::"]

Estoy trabajando en un proyecto en clojure, que puede interoperar con cualquier clase de Java, por lo que la respuesta a mi pregunta podría ser para java o clojure.

Básicamente, necesito poder dividir una cadena en componentes basados ​​en un delimitador dado (que será más de un carácter) pero al mismo tiempo mantener los delimitadores.

Por ejemplo:

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

Los armarios que he usado usan clojure.string clojure.string/split de clojure.string/split , pero en realidad no devuelve los delimitadores. El segundo más cercano fue usar StringTokenizer, que devuelve los delimitadores pero no acepta los delimitadores de múltiples caracteres.

¿Alguien sabe de alguna solución aparte de simplemente dividir la cadena en una secuencia de caracteres y ejecutar una reducción extraña en ella?


(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")