2011-02-04 7 views
5

Dada una cadena, quiero reemplazar todos los enlaces dentro de ella con la descripción del enlace. Por ejemplo, dadaen emacs-lisp, ¿cómo uso correctamente replace-regexp-in-string?

this is a [[http://link][description]] 

me gustaría volver

this is a description 

Solía ​​re-constructor para construir esta expresión regular para un enlace:

\\[\\[[^\\[]+\\]\\[[^\\[]+\\]\\] 

Ésta es mi función:

(defun flatten-string-with-links (string) 
    (replace-regexp-in-string "\\[\\[[^\\[]+\\]\\[[^\\[]+\\]\\]" 
       (lambda(s) (nth 2 (split-string s "[\]\[]+"))) string)) 

En lugar de reemplazar th e toda la secuencia de expresiones regulares, solo reemplaza el final "]]". Esto es lo que produce:

this is a [[http://link][descriptiondescription 

No entiendo lo que está pasando mal. Cualquier ayuda sería muy apreciada.

ACTUALIZACIÓN: He mejorado la expresión regular para el enlace. Es irrelevante para la pregunta, pero si alguien va a copiarlo, también puede obtener la mejor versión.

Respuesta

7

Su problema es que split-string está golpeando fuertemente los datos de los partidos, que replace-regexp-in-string confía en ser sin cambios, ya que va a ir uso que coincidan con los datos para decidir qué secciones de la cadena para cortar. Este es posiblemente un error de doc en que replace-regexp-in-string no menciona que su función de reemplazo debe preservar los datos de coincidencia.

Puede solucionar mediante el uso de save-match-data, que es una macro previsto precisamente para este propósito:

(defun flatten-string-with-links (string) 
    (replace-regexp-in-string "\\[\\[[a-zA-Z:%@/\.]+\\]\\[[a-zA-Z:%@/\.]+\\]\\]" 
       (lambda (s) (save-match-data 
         (nth 2 (split-string s "[\]\[]+")))) string)) 
Cuestiones relacionadas