2011-02-04 35 views
5

Cho một chuỗi, tôi muốn thay thế tất cả các liên kết bên trong nó bằng mô tả của liên kết. Ví dụ, chotrong emacs-lisp, làm cách nào để sử dụng đúng chuỗi regexp-in-string?

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

Tôi muốn trở

this is a description 

tôi đã sử dụng tái xây dựng để xây dựng regexp này cho một liên kết:

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

Đây là chức năng của tôi:

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

Thay vì thay thế thứ e toàn bộ chuỗi regexp, nó chỉ thay thế dấu "]]". Đây là những gì nó tạo ra:

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

Tôi không hiểu chuyện gì đang xảy ra. Bất kì sự trợ giúp nào đều được đánh giá cao.

CẬP NHẬT: Tôi đã cải thiện regex cho liên kết. Nó không liên quan đến câu hỏi nhưng nếu ai đó sẽ sao chép nó, họ cũng có thể nhận được phiên bản tốt hơn.

Trả lời

7

Vấn đề của bạn là split-string được clobbering các dữ liệu phù hợp, mà replace-regexp-in-string là dựa vào là không thay đổi, vì nó sẽ sử dụng đi phù hợp với dữ liệu để quyết định các phần của chuỗi để cắt ra. Điều này được cho là lỗi tài liệu trong đó replace-regexp-in-string không đề cập đến rằng chức năng thay thế của bạn phải bảo toàn dữ liệu đối sánh.

Bạn có thể làm việc xung quanh bằng cách sử dụng save-match-data, mà là một vĩ mô cung cấp cho chính xác mục đích này:

(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)) 
Các vấn đề liên quan