如何在正则表达式中替换“(”和“\(”,Emacs / elisp风味?

时间:2010-05-12 03:08:06

标签: emacs elisp

问题为标题。

更具体地说,每次我想在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应该没问题,我是否正确?

1 个答案:

答案 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)))))