2011-02-04 1 views
5

文字列があれば、その中のすべてのリンクをリンクの説明に置き換えたいと思います。、どうすればreplace-regexp-in-stringを正しく使うことができますか?

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

これは私の関数である:

たとえば、私は

this is a description 

私はリンクのために、この正規表現を構築するために再ビルダーを使用を返したい

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

を与えられました

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

th正規表現全体のシーケンスは、末尾の "]]"だけを置き換えます。これは、それが生成するものです:

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

私は何がうまくいけないのか分かりません。どんな助けでも大歓迎です。

更新日:リンクの正規表現が改善されました。それは質問には関係ありませんが、もし誰かがそれをコピーしようとすると、より良いバージョンを得ることができるでしょう。

答えて

7

あなたの問題は、それが文字列のセクションをカットするかを決定するためのデータと一致し 、外出先での使用に起こっているので、split-stringは、 replace-regexp-in-stringは変わらないことに頼っているマッチデータを、つかうされていることです。この は、おそらくreplace-regexp-in-stringには というマッチングデータを保存しなければならないということに言及していないという点で、ドキュメントのバグです。

あなたは まさにこの目的のために提供するマクロである、save-match-dataを使用することによって回避することができます。

(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)) 
関連する問題