gpt4 book ai didi

emacs - 如何在正则表达式、Emacs/elisp 风格中用 "("替换 "\("?

转载 作者:行者123 更新时间:2023-12-02 07:52:34 26 4
gpt4 key购买 nike

问题作为标题。

更具体地说,我已经厌倦了每次在 Emacs 的(交互式)正则表达式函数中需要一个括号时都必须键入 \( 等(更不用说 \\( 在代码中)。所以我写了类似的东西

(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 应该没问题,我说得对吗?

最佳答案

你的替代品对我来说效果很好。

取文字:

hi there mom
hi son!

并根据您的建议尝试查询替换正则表达式:

M-x query-replace-regexp (hi).*(mom) RET \1 \2! RET

产量

hi mom!
hi son!

我不必在括号前加上反斜杠就可以将它们分组。也就是说,这将无法匹配实际的括号......

replace-regexp-in-string 产生 \\(abc 的原因是,作为一个 string,这相当于交互式输入的 \(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)))))

关于emacs - 如何在正则表达式、Emacs/elisp 风格中用 "("替换 "\("?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2815903/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com