给定一个字符串,我想用链接的描述替换其中的所有链接。例如,给定
this is a [[http://link][description]]
我想返回
this is a description
我使用re-builder为链接构建了这个正则表达式:
\\[\\[[^\\[]+\\]\\[[^\\[]+\\]\\]
这是我的功能:
(defun flatten-string-with-links (string)
(replace-regexp-in-string "\\[\\[[^\\[]+\\]\\[[^\\[]+\\]\\]"
(lambda(s) (nth 2 (split-string s "[\]\[]+"))) string))
它不是替换整个正则表达式序列,而是仅替换尾随的“]]”。这就是它产生的:
this is a [[http://link][descriptiondescription
我不明白出了什么问题。任何帮助将不胜感激。
更新:我改进了链接的正则表达式。这与问题无关,但如果有人要复制它,他们也可以获得更好的版本。
答案 0 :(得分: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))