问题为标题。
更具体地说,每次我想在Emacs(交互式)regexp函数中使用括号(更不用说代码中的\(
)时,我已经厌倦了必须输入\\(
等。所以我写了类似
(defadvice query-replace-regexp (before my-query-replace-regexp activate)
(ad-set-arg 0 (replace-regexp-in-string "(" "\\\\(" (ad-get-arg 0)))
(ad-set-arg 0 (replace-regexp-in-string ")" "\\\\)" (ad-get-arg 0)))))
希望在“交互模式”期间我可以方便地忘记在正则表达式中emacs的特性。除非我无法正确使用正则表达式...
(replace-regexp-in-string "(" "\\\\(" "(abc")
代替\\(abc
代替\(abc
。斜杠数量的其他变化只会产生错误。想法?
自从我开始提问以来,不妨再问另一个:因为lisp代码不应该使用交互式功能,所以建议query-replace-regexp
应该没问题,我是否正确?
答案 0 :(得分:7)
你的替代品对我有用。
采取文字:
hi there mom
hi son!
并使用您的建议尝试query-replace-regexp:
M-x query-replace-regexp (hi).*(mom) RET \1 \2! RET
产量
hi mom!
hi son!
我没有在括号前加上反斜杠来让他们分组。也就是说,这会禁用能够匹配实际的括号......
replace-regexp-in-string
产生\\(abc
的原因是字符串,相当于交互式\(abc
。字符串\
用于表示以下字符是特殊的,例如"\t"
是带有标签的字符串。因此,为了只指定一个反斜杠,你需要在它前面使用反斜杠"\\"
是一个包含反斜杠的字符串。
关于建议交互功能,lisp代码可以调用所需的全部交互功能。一个主要的例子是find-file
- 它被称为遍布整个地方。为了使您的建议更安全一些,您可以使用interactive-p
检查身体以避免与内部呼叫混淆:
(defadvice query-replace-regexp (before my-query-replace-regexp activate)
(when (interactive-p)
(ad-set-arg 0 (replace-regexp-in-string "(" "\\\\(" (ad-get-arg 0)))
(ad-set-arg 0 (replace-regexp-in-string ")" "\\\\)" (ad-get-arg 0)))))