Emacs:如何在defun中用lisp函数替换正则表达式?

| 例如,我想在所有括号内加上(),UPCASE。交互执行以下操作很简单:
M-x query-replace-regexp
replace: \"(\\(.+?\\))\"
with   : \"(\\,(upcase \\1))\"
相反,我想写一个
defun
来做到这一点:
(defun upcs ()
  (interactive)
  (goto-char 1)
  (while (search-forward \"(\\\\(.+?\\\\))\" nil t) (replace-match \"(\\\\,(upcase \\\\1))\" t nil)))
但这不起作用!尽管有以下工作(将“ 3”和“ 4”追加到括号内的文本之后):
(defun HOOK ()
  (interactive)
  (goto-char 1)
  (while (search-forward-regexp \"(\\\\(.+?\\\\))\" nil t) (replace-match \"(foo \\\\1 bar)\" t nil)))
    
已邀请:
        卢克的答案几乎可以胜任工作,但并不完全。原始张贴者希望将括号内包含的所有文本都转换为大写,而卢克的代码将代码转换为大写,并且还删除了括号。对regex稍加修改即可提供正确的解决方案:
(defun upcs ()
(interactive)
(goto-char 1)
    (while (search-forward-regexp \"\\\\([^\\\\)]+\\\\)\" nil t) 
        (replace-match (upcase (match-string 1)) t nil)))
    
        首先,您在第一个功能中使用ѭ7。这需要字符串文字而不是正则表达式。您应该像在第二个功能中一样使用
search-forward-regexp
。 其次,虽然此代码可作为
query-replace-regexp
的替换值有效,但我认为您不能将其传递给
replace-match
(\\\\,(upcase \\\\1))
您可以使用
match-string
函数获得
search-forward-regexp
找到的匹配值。 最后,我不确定您的搜索正则表达式是否正确。 我认为您需要遵循以下原则:
(defun upcs ()
    (interactive)
    (goto-char 1)
        (while (search-forward-regexp \"(\\\\([^\\\\)]+\\\\))\" nil t) 
            (replace-match (upcase (match-string 1)) t nil)))
    
        这样就解决了问题。
(defun put-in-par (str)
  (concat \"(\" str \")\"))

(defun upcs-luke ()
    (interactive)
    (goto-char 1)
        (while (search-forward-regexp \"(\\\\([^\\\\)]+\\\\))\" nil t) 
            (replace-match (put-in-par (upcase (match-string 1))) t nil)))
感谢BillC和Luke Girvin的帮助。     
        非常有用,谢谢大家。 为了在网络上放置更多示例,我从此出发:
(replace-regexp \"\\([\\%\\)\\”\\\"]\\..?\\)[0-9]+\" \"\\1\")
(这不起作用,但是使用了在交互模式下起作用的正则表达式) 对此:
(while (re-search-forward \"\\\\([\\\\%\\\\\\\"\\\\”]\\\\)\\\\.?[0-9]+\" nil t)
    (replace-match (match-string 1) t nil))
在内部引号之前,我需要三个反斜杠。     

要回复问题请先登录注册