每隔一段时间,我想替换所有值的实例,例如:
<BarFoo>
和
<barfoo>
即用正则表达式替换尖括号内的所有内容,用它的小写等效项。
有人有一个很好的 Lisp 片段可以做到这一点吗?假设我们只处理 ASCII 值是安全的。任何足以采用完整正则表达式的通用内容的加分点,并且不仅仅处理尖括号示例。仅使用M-x query-replace-regexp
.
谢谢,
多姆
尝试M-x query-replace-regexp
使用"<\([^>]+\)>"
作为搜索字符串和"<\,(downcase \1)>"
替换。
这应该适用于 Emacs 22 及更高版本,有关如何在替换字符串中使用 Lisp 表达式的更多详细信息,请参阅此Steve Yegge 博客文章。
对于早期版本的 Emacs,您可以尝试以下操作:
(defun tags-to-lower-case ()
(interactive)
(save-excursion
(goto-char (point-min))
(while (re-search-forward "<[^>]+>" nil t)
(replace-match (downcase (match-string 0)) t))))
我意识到这个问题很古老,但我刚刚发现如何在版本 22之前的 Emacs 中执行此操作(我的版本是 21.3.1),而无需定义自定义 Lisp 函数:使用(在此 Emacs wiki 页面M-x query-replace-regexp-eval
顶部提到)作为搜索字符串和替换。<\([^>]+\)>
(concat "<" (downcase \1) ">")
这应该适用于任何可以定义为部分串联的替换字符串,包括未被任何函数修改的捕获组。例如:
<BarFoo baz="Quux">
可以只小写标签名称:
<barfoo baz="Quux">
通过使用搜索字符串<\([A-Za-z]+\)\([^>]*\)>
和替换(concat "<" (downcase \1) \2 ">")
(这也适用于看起来像没有属性的标签的 OP 示例)。
使用邪恶时,你可以简单地做:%s/<\([^>]+\)>/<\L\1>
\L
负责将以下所有字母小写,这也适用于query-replace-regexp
.
我没有找到有关 Emacs 的文档,但它似乎与此列表匹配:https ://www.boost.org/doc/libs/1_44_0/libs/regex/doc/html/boost_regex/format/perl_format.html