2011-02-04 5 views
5

Dato una stringa, voglio sostituire tutti i collegamenti al suo interno con la descrizione del collegamento. Ad esempio, datoin emacs-lisp, come faccio a usare replace-regexp-in-string?

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

Vorrei tornare

this is a description 

ho usato ri-builder per costruire questo regexp per un collegamento:

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

Questa è la mia funzione:

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

Invece di sostituire e l'intera sequenza regexp, sostituisce solo il trailing "]]". Questo è quello che produce:

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

Non capisco cosa non va. Qualsiasi aiuto sarebbe molto apprezzato.

UPDATE: Ho migliorato la regex per il collegamento. È irrilevante per la domanda, ma se qualcuno lo copierà potrebbe anche ottenere la versione migliore.

risposta

7

tuo problema è che split-string è clobbering dati match, che replace-regexp-in-string si basa su essere invariata, dal momento che sta per uso go che corrispondono i dati per decidere quali sezioni della stringa da ritagliare. Questo è probabilmente un bug doc in quanto replace-regexp-in-string non menziona che la funzione di sostituzione deve conservare i dati di corrispondenza.

È possibile aggirare utilizzando save-match-data, che è una macro previsto esattamente questo scopo:

(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)) 
Problemi correlati