2011-02-04 10 views
5

Podając ciąg, chcę zamienić wszystkie linki w nim za pomocą opisu linku. Na przykład, biorąc pod uwagęw emacs-sepp, w jaki sposób poprawnie użyć replace-regexp-in-string?

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

Chciałbym wrócić

this is a description 

użyłem re-builder skonstruować ten regexp dla linkiem:

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

To jest moja funkcja:

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

Zamiast zastępować e cała sekwencja regexp, zastępuje tylko końcowe "]]". Oto, co produkuje:

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

Nie rozumiem, co się dzieje. Każda pomoc byłaby bardzo cenna.

UPDATE: Poprawiłem wyrażenie regularne dla linku. Nie ma to znaczenia dla tego pytania, ale jeśli ktoś go skopiuje, mogą równie dobrze uzyskać lepszą wersję.

Odpowiedz

7

Twój problem polega na tym split-string jest clobbering dane mecz, który replace-regexp-in-string powołuje się na bycie na niezmienionym poziomie, ponieważ ma zamiar odchodzenia użytku, które odpowiadają dane zdecydować, które odcinki łańcucha wyciąć. Ten jest prawdopodobnie błędem do dokumentu, ponieważ replace-regexp-in-string nie wspomina o tym, że funkcja zastępująca musi zachować dane dopasowania.

można obejść stosując save-match-data, który jest przewidziany makro dokładnie tym celu:

(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)) 
Powiązane problemy