2011-02-04 3 views
5

문자열이 주어지면 그 안에있는 모든 링크를 링크의 설명으로 대체하려고합니다. 이 제 기능을을 사용하면 어떻게 replace-regexp-in-string을 올바르게 사용할 수 있습니까?

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

입니다 :

예를 들어,

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

은 내가 링크이 정규 표현식을 구성하기 위해 재 빌더 사용

this is a description 

반환 싶습니다 제공

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

대신 th e 전체 regexp 시퀀스, 그것은 단지 후행 "]]"를 대체합니다. 이것은 생산되는 것입니다 :

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

나는 무엇이 잘못 됐는지 이해하지 못합니다. 어떤 도움이라도 대단히 감사 할 것입니다.

업데이트 : 링크의 정규식을 개선했습니다. 이 질문과 관련이 없지만 다른 사람이 복사하면 더 나은 버전을 얻을 수 있습니다.

답변

7

귀하의 문제는 문자열의 부분은 잘라 결정하는 데이터와 일치 이동에 사용하려고하기 때문에 split-stringreplace-regexp-in-string이 변경되는에 의존 경기 데이터를 건드리지 점이다. 이 은 replace-regexp-in-string에 대체 데이터가 보존되어야한다는 언급이 없다는 점에서 논란의 여지가있는 문서 버그입니다.

(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)) 
:

당신은 바로이 목적을 위해 제공되는 매크로 인 save-match-data를 사용하여 해결할 수 있습니다

관련 문제