Stuart Halloway da el ejemplocódigo Clojure compacto para coincidencias de expresiones regulares y su posición en la cadena de
(re-seq #"\w+" "The quick brown fox")
como el método natural para la búsqueda de coincidencias de partidos de expresiones regulares en Clojure. En su libro, esta construcción se contrasta con la iteración sobre un matcher. Si todo lo que le importaba fuera una lista de coincidencias, sería genial. Sin embargo, ¿qué pasa si quiero coincidencias y su posición dentro de la cadena? ¿Hay una forma mejor de hacer esto que me permita aprovechar la funcionalidad existente en java.util.regex y recurrir a algo así como una comprensión de secuencia sobre cada índice en la cadena original? En otras palabras, a uno le gustaría escribir algo así como
(re-ss-mapa # "[0-9] +" "3a1b2c1d")
que devolver un mapa con teclas como la posición y los valores como las coincidencias, por ejemplo
{0 "3", 2 "1", 4 "2", 6 "1"}
¿Hay alguna aplicación de este en una biblioteca existente ya o se lo escribo (no debe ser demasiado mayo de líneas de código)?
Gracias Brian. Tal vez re-pos debe encontrar su camino en la biblioteca de expresiones regulares. –
Tengo un pequeño problema con esto. (re-pos # "ATAT" "GATATATGCATATACTT") debería devolver {9 "ATAT", 3 "ATAT", 1 "ATAT"} pero devuelve {9 "ATAT", 1 "ATAT"}. – boucekv
Si desea contar coincidencias superpuestas, cambie un poco la expresión regular: (re-pos # "(? = (ATAT))" "GATATATGCATATACTT" devuelve {9 "", 3 "", 1 ""}. Si desea recuperar el texto coincidente, debe hacer (.grupo m 1) en lugar de (.grupo m). –